summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/Surface.h
blob: 430bf0195dc6a8cc02f4b896a2db3d4516e171a8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//
// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// Surface.h: Defines the egl::Surface class, representing a drawing surface
// such as the client area of a window, including any back buffers.
// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3.

#ifndef LIBANGLE_SURFACE_H_
#define LIBANGLE_SURFACE_H_

#include <EGL/egl.h>

#include "common/angleutils.h"
#include "libANGLE/Error.h"
#include "libANGLE/RefCountObject.h"

namespace gl
{
class Texture;
}

namespace rx
{
class SurfaceImpl;
}

namespace egl
{
class AttributeMap;
class Display;
struct Config;

class Surface final : public RefCountObject
{
  public:
    Surface(rx::SurfaceImpl *impl, EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes);

    rx::SurfaceImpl *getImplementation() { return mImplementation; }
    const rx::SurfaceImpl *getImplementation() const { return mImplementation; }

    EGLint getType() const;

    Error swap();
    Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height);
    Error querySurfacePointerANGLE(EGLint attribute, void **value);
    Error bindTexImage(gl::Texture *texture, EGLint buffer);
    Error releaseTexImage(EGLint buffer);

    EGLint isPostSubBufferSupported() const;

    void setSwapInterval(EGLint interval);

    const Config *getConfig() const;

    // width and height can change with client window resizing
    EGLint getWidth() const;
    EGLint getHeight() const;
    EGLint getPixelAspectRatio() const;
    EGLenum getRenderBuffer() const;
    EGLenum getSwapBehavior() const;
    EGLenum getTextureFormat() const;
    EGLenum getTextureTarget() const;

    gl::Texture *getBoundTexture() const { return mTexture; }

    EGLint isFixedSize() const;

  private:
    virtual ~Surface();

    rx::SurfaceImpl *mImplementation;

    EGLint mType;

    const egl::Config *mConfig;

    bool mPostSubBufferRequested;

    bool mFixedSize;
    size_t mFixedWidth;
    size_t mFixedHeight;

    EGLenum mTextureFormat;
    EGLenum mTextureTarget;

    EGLint mPixelAspectRatio;      // Display aspect ratio
    EGLenum mRenderBuffer;         // Render buffer
    EGLenum mSwapBehavior;         // Buffer swap behavior

    gl::Texture *mTexture;
};

}

#endif   // LIBANGLE_SURFACE_H_