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 UI_GL_GL_SURFACE_OSMESA_H_
6#define UI_GL_GL_SURFACE_OSMESA_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "ui/gfx/size.h"
10#include "ui/gl/gl_surface.h"
11
12namespace gfx {
13
14enum OSMesaSurfaceFormat { OSMesaSurfaceFormatBGRA, OSMesaSurfaceFormatRGBA };
15
16// A surface that the Mesa software renderer draws to. This is actually just a
17// buffer in system memory. GetHandle returns a pointer to the buffer. These
18// surfaces can be resized and resizing preserves the contents.
19class GL_EXPORT GLSurfaceOSMesa : public GLSurface {
20 public:
21  GLSurfaceOSMesa(OSMesaSurfaceFormat format, const gfx::Size& size);
22
23  // Implement GLSurface.
24  virtual bool Initialize() OVERRIDE;
25  virtual void Destroy() OVERRIDE;
26  virtual bool Resize(const gfx::Size& new_size) OVERRIDE;
27  virtual bool IsOffscreen() OVERRIDE;
28  virtual bool SwapBuffers() OVERRIDE;
29  virtual gfx::Size GetSize() OVERRIDE;
30  virtual void* GetHandle() OVERRIDE;
31  virtual unsigned GetFormat() OVERRIDE;
32
33 protected:
34  virtual ~GLSurfaceOSMesa();
35
36 private:
37  unsigned format_;
38  gfx::Size size_;
39  scoped_ptr<int32[]> buffer_;
40
41  DISALLOW_COPY_AND_ASSIGN(GLSurfaceOSMesa);
42};
43
44// A thin subclass of |GLSurfaceOSMesa| that can be used in place
45// of a native hardware-provided surface when a native surface
46// provider is not available.
47class GLSurfaceOSMesaHeadless : public GLSurfaceOSMesa {
48 public:
49  explicit GLSurfaceOSMesaHeadless();
50
51  virtual bool IsOffscreen() OVERRIDE;
52  virtual bool SwapBuffers() OVERRIDE;
53
54 protected:
55  virtual ~GLSurfaceOSMesaHeadless();
56
57 private:
58  DISALLOW_COPY_AND_ASSIGN(GLSurfaceOSMesaHeadless);
59};
60
61}  // namespace gfx
62
63#endif  // UI_GL_GL_SURFACE_OSMESA_H_
64