1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
6#define GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
7
8#include <EGL/egl.h>
9
10#include "base/memory/scoped_ptr.h"
11#include "gpu/command_buffer/client/gles2_cmd_helper.h"
12#include "gpu/command_buffer/client/gpu_control.h"
13#include "gpu/command_buffer/service/command_buffer_service.h"
14#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
15#include "gpu/command_buffer/service/gpu_scheduler.h"
16#include "ui/gfx/native_widget_types.h"
17#include "ui/gl/gl_context.h"
18#include "ui/gl/gl_surface.h"
19
20namespace gpu {
21class CommandBufferService;
22class GpuControl;
23class GpuScheduler;
24class TransferBuffer;
25class TransferBufferManagerInterface;
26
27namespace gles2 {
28class GLES2CmdHelper;
29class GLES2Implementation;
30}  // namespace gles2
31}  // namespace gpu
32
33namespace egl {
34
35class Config;
36class Surface;
37
38class Display : private gpu::GpuControl {
39 public:
40  explicit Display(EGLNativeDisplayType display_id);
41  virtual ~Display();
42
43  void SetCreateOffscreen(int width, int height) {
44    create_offscreen_ = true;
45    create_offscreen_width_ = width;
46    create_offscreen_height_ = height;
47  }
48
49  bool is_initialized() const { return is_initialized_; }
50  bool Initialize();
51
52  // Config routines.
53  bool IsValidConfig(EGLConfig config);
54  bool ChooseConfigs(
55      EGLConfig* configs, EGLint config_size, EGLint* num_config);
56  bool GetConfigs(EGLConfig* configs, EGLint config_size, EGLint* num_config);
57  bool GetConfigAttrib(EGLConfig config, EGLint attribute, EGLint* value);
58
59  // Surface routines.
60  bool IsValidNativeWindow(EGLNativeWindowType win);
61  bool IsValidSurface(EGLSurface surface);
62  EGLSurface CreateWindowSurface(EGLConfig config,
63                                 EGLNativeWindowType win,
64                                 const EGLint* attrib_list);
65  void DestroySurface(EGLSurface surface);
66  void SwapBuffers(EGLSurface surface);
67
68  // Context routines.
69  bool IsValidContext(EGLContext ctx);
70  EGLContext CreateContext(EGLConfig config,
71                           EGLContext share_ctx,
72                           const EGLint* attrib_list);
73  void DestroyContext(EGLContext ctx);
74  bool MakeCurrent(EGLSurface draw, EGLSurface read, EGLContext ctx);
75
76  // GpuControl implementation.
77  virtual gpu::Capabilities GetCapabilities() OVERRIDE;
78  virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer(size_t width,
79                                                      size_t height,
80                                                      unsigned internalformat,
81                                                      unsigned usage,
82                                                      int32* id) OVERRIDE;
83  virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE;
84  virtual uint32 InsertSyncPoint() OVERRIDE;
85  virtual uint32 InsertFutureSyncPoint() OVERRIDE;
86  virtual void RetireSyncPoint(uint32 sync_point) OVERRIDE;
87  virtual void SignalSyncPoint(uint32 sync_point,
88                               const base::Closure& callback) OVERRIDE;
89  virtual void SignalQuery(uint32 query,
90                           const base::Closure& callback) OVERRIDE;
91  virtual void SetSurfaceVisible(bool visible) OVERRIDE;
92  virtual void Echo(const base::Closure& callback) OVERRIDE;
93  virtual uint32 CreateStreamTexture(uint32 texture_id) OVERRIDE;
94
95 private:
96  EGLNativeDisplayType display_id_;
97
98  bool is_initialized_;
99  bool create_offscreen_;
100  int create_offscreen_width_;
101  int create_offscreen_height_;
102
103  scoped_ptr<gpu::TransferBufferManagerInterface> transfer_buffer_manager_;
104  scoped_ptr<gpu::CommandBufferService> command_buffer_;
105  scoped_ptr<gpu::GpuScheduler> gpu_scheduler_;
106  scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
107  scoped_refptr<gfx::GLContext> gl_context_;
108  scoped_refptr<gfx::GLSurface> gl_surface_;
109  scoped_ptr<gpu::gles2::GLES2CmdHelper> gles2_cmd_helper_;
110  scoped_ptr<gpu::TransferBuffer> transfer_buffer_;
111
112  // TODO(alokp): Support more than one config, surface, and context.
113  scoped_ptr<Config> config_;
114  scoped_ptr<Surface> surface_;
115  scoped_ptr<gpu::gles2::GLES2Implementation> context_;
116
117  DISALLOW_COPY_AND_ASSIGN(Display);
118};
119
120}  // namespace egl
121
122#endif  // GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
123