15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <EGL/egl.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_cmd_helper.h"
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "gpu/command_buffer/client/gpu_control.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/command_buffer_service.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_scheduler.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_context.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_surface.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandBufferService;
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GpuControl;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuScheduler;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransferBuffer;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransferBufferManagerInterface;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2CmdHelper;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Implementation;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace egl {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Config;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Surface;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class Display : private gpu::GpuControl {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Display(EGLNativeDisplayType display_id);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Display();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCreateOffscreen(int width, int height) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    create_offscreen_ = true;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    create_offscreen_width_ = width;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    create_offscreen_height_ = height;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_initialized() const { return is_initialized_; }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Initialize();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Config routines.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidConfig(EGLConfig config);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ChooseConfigs(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EGLConfig* configs, EGLint config_size, EGLint* num_config);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetConfigs(EGLConfig* configs, EGLint config_size, EGLint* num_config);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetConfigAttrib(EGLConfig config, EGLint attribute, EGLint* value);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Surface routines.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidNativeWindow(EGLNativeWindowType win);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidSurface(EGLSurface surface);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EGLSurface CreateWindowSurface(EGLConfig config,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 EGLNativeWindowType win,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const EGLint* attrib_list);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroySurface(EGLSurface surface);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SwapBuffers(EGLSurface surface);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Context routines.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsValidContext(EGLContext ctx);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EGLContext CreateContext(EGLConfig config,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           EGLContext share_ctx,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const EGLint* attrib_list);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyContext(EGLContext ctx);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MakeCurrent(EGLSurface draw, EGLSurface read, EGLContext ctx);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // GpuControl implementation.
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual gpu::Capabilities GetCapabilities() OVERRIDE;
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer(size_t width,
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      size_t height,
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      unsigned internalformat,
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      unsigned usage,
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                      int32* id) OVERRIDE;
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE;
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual uint32 InsertSyncPoint() OVERRIDE;
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual uint32 InsertFutureSyncPoint() OVERRIDE;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RetireSyncPoint(uint32 sync_point) OVERRIDE;
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SignalSyncPoint(uint32 sync_point,
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               const base::Closure& callback) OVERRIDE;
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SignalQuery(uint32 query,
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                           const base::Closure& callback) OVERRIDE;
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SetSurfaceVisible(bool visible) OVERRIDE;
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void Echo(const base::Closure& callback) OVERRIDE;
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual uint32 CreateStreamTexture(uint32 texture_id) OVERRIDE;
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EGLNativeDisplayType display_id_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_initialized_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool create_offscreen_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int create_offscreen_width_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int create_offscreen_height_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::TransferBufferManagerInterface> transfer_buffer_manager_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::CommandBufferService> command_buffer_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::GpuScheduler> gpu_scheduler_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::GLES2Decoder> decoder_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLContext> gl_context_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<gfx::GLSurface> gl_surface_;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::GLES2CmdHelper> gles2_cmd_helper_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::TransferBuffer> transfer_buffer_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(alokp): Support more than one config, surface, and context.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Config> config_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Surface> surface_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<gpu::gles2::GLES2Implementation> context_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Display);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace egl
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
123