1 
2 // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // D3DTextureSurfaceWGL.h: WGL implementation of egl::Surface for D3D texture interop.
8 
9 #ifndef LIBANGLE_RENDERER_GL_WGL_D3DTEXTIRESURFACEWGL_H_
10 #define LIBANGLE_RENDERER_GL_WGL_D3DTEXTIRESURFACEWGL_H_
11 
12 #include "libANGLE/renderer/gl/wgl/SurfaceWGL.h"
13 
14 #include <GL/wglext.h>
15 
16 namespace rx
17 {
18 
19 class FunctionsGL;
20 class FunctionsWGL;
21 class DisplayWGL;
22 class StateManagerGL;
23 
24 class D3DTextureSurfaceWGL : public SurfaceWGL
25 {
26   public:
27     D3DTextureSurfaceWGL(const egl::SurfaceState &state,
28                          StateManagerGL *stateManager,
29                          EGLenum buftype,
30                          EGLClientBuffer clientBuffer,
31                          DisplayWGL *display,
32                          HDC deviceContext,
33                          ID3D11Device *displayD3D11Device,
34                          const FunctionsGL *functionsGL,
35                          const FunctionsWGL *functionsWGL);
36     ~D3DTextureSurfaceWGL() override;
37 
38     static egl::Error ValidateD3DTextureClientBuffer(EGLenum buftype,
39                                                      EGLClientBuffer clientBuffer,
40                                                      ID3D11Device *d3d11Device);
41 
42     egl::Error initialize(const egl::Display *display) override;
43     egl::Error makeCurrent(const gl::Context *context) override;
44     egl::Error unMakeCurrent(const gl::Context *context) override;
45 
46     egl::Error swap(const gl::Context *context) override;
47     egl::Error postSubBuffer(const gl::Context *context,
48                              EGLint x,
49                              EGLint y,
50                              EGLint width,
51                              EGLint height) override;
52     egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
53     egl::Error bindTexImage(const gl::Context *context,
54                             gl::Texture *texture,
55                             EGLint buffer) override;
56     egl::Error releaseTexImage(const gl::Context *context, EGLint buffer) override;
57     void setSwapInterval(EGLint interval) override;
58 
59     EGLint getWidth() const override;
60     EGLint getHeight() const override;
61 
62     EGLint isPostSubBufferSupported() const override;
63     EGLint getSwapBehavior() const override;
64 
65     FramebufferImpl *createDefaultFramebuffer(const gl::Context *context,
66                                               const gl::FramebufferState &data) override;
67 
68     HDC getDC() const override;
69 
70     const angle::Format *getD3DTextureColorFormat() const override;
71 
72   private:
73     EGLenum mBuftype;
74     EGLClientBuffer mClientBuffer;
75 
76     ID3D11Device *mDisplayD3D11Device;
77 
78     DisplayWGL *mDisplay;
79     StateManagerGL *mStateManager;
80     const FunctionsGL *mFunctionsGL;
81     const FunctionsWGL *mFunctionsWGL;
82 
83     HDC mDeviceContext;
84 
85     size_t mWidth;
86     size_t mHeight;
87 
88     const angle::Format *mColorFormat;
89 
90     HANDLE mDeviceHandle;
91     IUnknown *mObject;
92     IDXGIKeyedMutex *mKeyedMutex;
93     HANDLE mBoundObjectTextureHandle;
94     HANDLE mBoundObjectRenderbufferHandle;
95 
96     GLuint mColorRenderbufferID;
97     GLuint mDepthStencilRenderbufferID;
98 };
99 }  // namespace rx
100 
101 #endif  // LIBANGLE_RENDERER_GL_WGL_D3DTEXTIRESURFACEWGL_H_
102