xref: /aosp_15_r20/external/angle/src/tests/egl_tests/EGLPresentPathD3D11Test.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include <d3d11.h>
10*8975f5c5SAndroid Build Coastguard Worker #include <cstdint>
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "util/OSWindow.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "util/com_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker class EGLPresentPathD3D11 : public ANGLETest<>
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker   protected:
EGLPresentPathD3D11()20*8975f5c5SAndroid Build Coastguard Worker     EGLPresentPathD3D11()
21*8975f5c5SAndroid Build Coastguard Worker         : mDisplay(EGL_NO_DISPLAY),
22*8975f5c5SAndroid Build Coastguard Worker           mContext(EGL_NO_CONTEXT),
23*8975f5c5SAndroid Build Coastguard Worker           mSurface(EGL_NO_SURFACE),
24*8975f5c5SAndroid Build Coastguard Worker           mOffscreenSurfaceD3D11Texture(nullptr),
25*8975f5c5SAndroid Build Coastguard Worker           mConfig(0),
26*8975f5c5SAndroid Build Coastguard Worker           mOSWindow(nullptr),
27*8975f5c5SAndroid Build Coastguard Worker           mWindowWidth(0)
28*8975f5c5SAndroid Build Coastguard Worker     {}
29*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()30*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
31*8975f5c5SAndroid Build Coastguard Worker     {
32*8975f5c5SAndroid Build Coastguard Worker         mOSWindow    = OSWindow::New();
33*8975f5c5SAndroid Build Coastguard Worker         mWindowWidth = 64;
34*8975f5c5SAndroid Build Coastguard Worker         mOSWindow->initialize("EGLPresentPathD3D11", mWindowWidth, mWindowWidth);
35*8975f5c5SAndroid Build Coastguard Worker     }
36*8975f5c5SAndroid Build Coastguard Worker 
initializeEGL(bool usePresentPathFast)37*8975f5c5SAndroid Build Coastguard Worker     void initializeEGL(bool usePresentPathFast)
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         int clientVersion = GetParam().majorVersion;
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker         // Set up EGL Display
42*8975f5c5SAndroid Build Coastguard Worker         EGLint displayAttribs[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE,
43*8975f5c5SAndroid Build Coastguard Worker                                    GetParam().getRenderer(),
44*8975f5c5SAndroid Build Coastguard Worker                                    EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE,
45*8975f5c5SAndroid Build Coastguard Worker                                    GetParam().eglParameters.majorVersion,
46*8975f5c5SAndroid Build Coastguard Worker                                    EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE,
47*8975f5c5SAndroid Build Coastguard Worker                                    GetParam().eglParameters.majorVersion,
48*8975f5c5SAndroid Build Coastguard Worker                                    EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE,
49*8975f5c5SAndroid Build Coastguard Worker                                    usePresentPathFast ? EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE
50*8975f5c5SAndroid Build Coastguard Worker                                                       : EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE,
51*8975f5c5SAndroid Build Coastguard Worker                                    EGL_NONE};
52*8975f5c5SAndroid Build Coastguard Worker         mDisplay =
53*8975f5c5SAndroid Build Coastguard Worker             eglGetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, EGL_DEFAULT_DISPLAY, displayAttribs);
54*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(EGL_NO_DISPLAY != mDisplay);
55*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_TRUE(eglInitialize(mDisplay, nullptr, nullptr));
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker         // Choose the EGL config
58*8975f5c5SAndroid Build Coastguard Worker         EGLint numConfigs;
59*8975f5c5SAndroid Build Coastguard Worker         EGLint configAttribs[] = {EGL_RED_SIZE,
60*8975f5c5SAndroid Build Coastguard Worker                                   8,
61*8975f5c5SAndroid Build Coastguard Worker                                   EGL_GREEN_SIZE,
62*8975f5c5SAndroid Build Coastguard Worker                                   8,
63*8975f5c5SAndroid Build Coastguard Worker                                   EGL_BLUE_SIZE,
64*8975f5c5SAndroid Build Coastguard Worker                                   8,
65*8975f5c5SAndroid Build Coastguard Worker                                   EGL_ALPHA_SIZE,
66*8975f5c5SAndroid Build Coastguard Worker                                   8,
67*8975f5c5SAndroid Build Coastguard Worker                                   EGL_RENDERABLE_TYPE,
68*8975f5c5SAndroid Build Coastguard Worker                                   clientVersion == 3 ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_ES2_BIT,
69*8975f5c5SAndroid Build Coastguard Worker                                   EGL_SURFACE_TYPE,
70*8975f5c5SAndroid Build Coastguard Worker                                   EGL_PBUFFER_BIT,
71*8975f5c5SAndroid Build Coastguard Worker                                   EGL_NONE};
72*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_TRUE(eglChooseConfig(mDisplay, configAttribs, &mConfig, 1, &numConfigs));
73*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(1, numConfigs);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker         // Set up the EGL context
76*8975f5c5SAndroid Build Coastguard Worker         EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, clientVersion, EGL_NONE};
77*8975f5c5SAndroid Build Coastguard Worker         mContext                = eglCreateContext(mDisplay, mConfig, nullptr, contextAttribs);
78*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(EGL_NO_CONTEXT != mContext);
79*8975f5c5SAndroid Build Coastguard Worker     }
80*8975f5c5SAndroid Build Coastguard Worker 
createWindowSurface()81*8975f5c5SAndroid Build Coastguard Worker     void createWindowSurface()
82*8975f5c5SAndroid Build Coastguard Worker     {
83*8975f5c5SAndroid Build Coastguard Worker         mSurface = eglCreateWindowSurface(mDisplay, mConfig, mOSWindow->getNativeWindow(), nullptr);
84*8975f5c5SAndroid Build Coastguard Worker     }
85*8975f5c5SAndroid Build Coastguard Worker 
createPbufferFromClientBufferSurface()86*8975f5c5SAndroid Build Coastguard Worker     void createPbufferFromClientBufferSurface()
87*8975f5c5SAndroid Build Coastguard Worker     {
88*8975f5c5SAndroid Build Coastguard Worker         EGLAttrib device      = 0;
89*8975f5c5SAndroid Build Coastguard Worker         EGLAttrib angleDevice = 0;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(IsEGLClientExtensionEnabled("EGL_EXT_device_query"));
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_TRUE(eglQueryDisplayAttribEXT(mDisplay, EGL_DEVICE_EXT, &angleDevice));
94*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EGL_TRUE(eglQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice),
95*8975f5c5SAndroid Build Coastguard Worker                                                 EGL_D3D11_DEVICE_ANGLE, &device));
96*8975f5c5SAndroid Build Coastguard Worker         ID3D11Device *d3d11Device = reinterpret_cast<ID3D11Device *>(device);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker         D3D11_TEXTURE2D_DESC textureDesc = {0};
99*8975f5c5SAndroid Build Coastguard Worker         textureDesc.Width                = mWindowWidth;
100*8975f5c5SAndroid Build Coastguard Worker         textureDesc.Height               = mWindowWidth;
101*8975f5c5SAndroid Build Coastguard Worker         textureDesc.Format               = DXGI_FORMAT_B8G8R8A8_UNORM;
102*8975f5c5SAndroid Build Coastguard Worker         textureDesc.MipLevels            = 1;
103*8975f5c5SAndroid Build Coastguard Worker         textureDesc.ArraySize            = 1;
104*8975f5c5SAndroid Build Coastguard Worker         textureDesc.SampleDesc.Count     = 1;
105*8975f5c5SAndroid Build Coastguard Worker         textureDesc.SampleDesc.Quality   = 0;
106*8975f5c5SAndroid Build Coastguard Worker         textureDesc.Usage                = D3D11_USAGE_DEFAULT;
107*8975f5c5SAndroid Build Coastguard Worker         textureDesc.BindFlags            = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
108*8975f5c5SAndroid Build Coastguard Worker         textureDesc.CPUAccessFlags       = 0;
109*8975f5c5SAndroid Build Coastguard Worker         textureDesc.MiscFlags            = D3D11_RESOURCE_MISC_SHARED;
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(SUCCEEDED(
112*8975f5c5SAndroid Build Coastguard Worker             d3d11Device->CreateTexture2D(&textureDesc, nullptr, &mOffscreenSurfaceD3D11Texture)));
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker         IDXGIResource *dxgiResource =
115*8975f5c5SAndroid Build Coastguard Worker             DynamicCastComObject<IDXGIResource>(mOffscreenSurfaceD3D11Texture);
116*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, dxgiResource);
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker         HANDLE sharedHandle = 0;
119*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(SUCCEEDED(dxgiResource->GetSharedHandle(&sharedHandle)));
120*8975f5c5SAndroid Build Coastguard Worker         SafeRelease(dxgiResource);
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker         EGLint pBufferAttributes[] = {EGL_WIDTH,          mWindowWidth,       EGL_HEIGHT,
123*8975f5c5SAndroid Build Coastguard Worker                                       mWindowWidth,       EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
124*8975f5c5SAndroid Build Coastguard Worker                                       EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA,   EGL_NONE};
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker         mSurface = eglCreatePbufferFromClientBuffer(mDisplay, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE,
127*8975f5c5SAndroid Build Coastguard Worker                                                     sharedHandle, mConfig, pBufferAttributes);
128*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(EGL_NO_SURFACE != mSurface);
129*8975f5c5SAndroid Build Coastguard Worker     }
130*8975f5c5SAndroid Build Coastguard Worker 
makeCurrent()131*8975f5c5SAndroid Build Coastguard Worker     void makeCurrent() { ASSERT_EGL_TRUE(eglMakeCurrent(mDisplay, mSurface, mSurface, mContext)); }
132*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()133*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override
134*8975f5c5SAndroid Build Coastguard Worker     {
135*8975f5c5SAndroid Build Coastguard Worker         SafeRelease(mOffscreenSurfaceD3D11Texture);
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker         if (mDisplay != EGL_NO_DISPLAY)
138*8975f5c5SAndroid Build Coastguard Worker         {
139*8975f5c5SAndroid Build Coastguard Worker             eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker             if (mSurface != EGL_NO_SURFACE)
142*8975f5c5SAndroid Build Coastguard Worker             {
143*8975f5c5SAndroid Build Coastguard Worker                 eglDestroySurface(mDisplay, mSurface);
144*8975f5c5SAndroid Build Coastguard Worker                 mSurface = EGL_NO_SURFACE;
145*8975f5c5SAndroid Build Coastguard Worker             }
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker             if (mContext != EGL_NO_CONTEXT)
148*8975f5c5SAndroid Build Coastguard Worker             {
149*8975f5c5SAndroid Build Coastguard Worker                 ASSERT_EGL_TRUE(
150*8975f5c5SAndroid Build Coastguard Worker                     eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
151*8975f5c5SAndroid Build Coastguard Worker                 eglDestroyContext(mDisplay, mContext);
152*8975f5c5SAndroid Build Coastguard Worker                 mContext = EGL_NO_CONTEXT;
153*8975f5c5SAndroid Build Coastguard Worker             }
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker             eglTerminate(mDisplay);
156*8975f5c5SAndroid Build Coastguard Worker             mDisplay = EGL_NO_DISPLAY;
157*8975f5c5SAndroid Build Coastguard Worker         }
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker         mOSWindow->destroy();
160*8975f5c5SAndroid Build Coastguard Worker         OSWindow::Delete(&mOSWindow);
161*8975f5c5SAndroid Build Coastguard Worker     }
162*8975f5c5SAndroid Build Coastguard Worker 
drawQuadUsingGL()163*8975f5c5SAndroid Build Coastguard Worker     void drawQuadUsingGL()
164*8975f5c5SAndroid Build Coastguard Worker     {
165*8975f5c5SAndroid Build Coastguard Worker         GLuint m2DProgram;
166*8975f5c5SAndroid Build Coastguard Worker         GLint mTexture2DUniformLocation;
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker         constexpr char kVS[] =
169*8975f5c5SAndroid Build Coastguard Worker             R"(precision highp float;
170*8975f5c5SAndroid Build Coastguard Worker             attribute vec4 position;
171*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker             void main()
174*8975f5c5SAndroid Build Coastguard Worker             {
175*8975f5c5SAndroid Build Coastguard Worker                 gl_Position = vec4(position.xy, 0.0, 1.0);
176*8975f5c5SAndroid Build Coastguard Worker                 texcoord = (position.xy * 0.5) + 0.5;
177*8975f5c5SAndroid Build Coastguard Worker             })";
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] =
180*8975f5c5SAndroid Build Coastguard Worker             R"(precision highp float;
181*8975f5c5SAndroid Build Coastguard Worker             uniform sampler2D tex;
182*8975f5c5SAndroid Build Coastguard Worker             varying vec2 texcoord;
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker             void main()
185*8975f5c5SAndroid Build Coastguard Worker             {
186*8975f5c5SAndroid Build Coastguard Worker                 gl_FragColor = texture2D(tex, texcoord);
187*8975f5c5SAndroid Build Coastguard Worker             })";
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker         m2DProgram                = CompileProgram(kVS, kFS);
190*8975f5c5SAndroid Build Coastguard Worker         mTexture2DUniformLocation = glGetUniformLocation(m2DProgram, "tex");
191*8975f5c5SAndroid Build Coastguard Worker 
192*8975f5c5SAndroid Build Coastguard Worker         uint8_t textureInitData[16] = {
193*8975f5c5SAndroid Build Coastguard Worker             255, 0,   0,   255,  // Red
194*8975f5c5SAndroid Build Coastguard Worker             0,   255, 0,   255,  // Green
195*8975f5c5SAndroid Build Coastguard Worker             0,   0,   255, 255,  // Blue
196*8975f5c5SAndroid Build Coastguard Worker             255, 255, 0,   255   // Red + Green
197*8975f5c5SAndroid Build Coastguard Worker         };
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker         // Create a simple RGBA texture
200*8975f5c5SAndroid Build Coastguard Worker         GLuint tex = 0;
201*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &tex);
202*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
203*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
204*8975f5c5SAndroid Build Coastguard Worker                      textureInitData);
205*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
206*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
207*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
208*8975f5c5SAndroid Build Coastguard Worker 
209*8975f5c5SAndroid Build Coastguard Worker         // Draw a quad using the texture
210*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
211*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(m2DProgram);
212*8975f5c5SAndroid Build Coastguard Worker         glUniform1i(mTexture2DUniformLocation, 0);
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker         GLint positionLocation = glGetAttribLocation(m2DProgram, "position");
215*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(m2DProgram);
216*8975f5c5SAndroid Build Coastguard Worker         const GLfloat vertices[] = {
217*8975f5c5SAndroid Build Coastguard Worker             -1.0f, 1.0f, 0.5f, -1.0f, -1.0f, 0.5f, 1.0f, -1.0f, 0.5f,
218*8975f5c5SAndroid Build Coastguard Worker             -1.0f, 1.0f, 0.5f, 1.0f,  -1.0f, 0.5f, 1.0f, 1.0f,  0.5f,
219*8975f5c5SAndroid Build Coastguard Worker         };
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker         glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
222*8975f5c5SAndroid Build Coastguard Worker         glEnableVertexAttribArray(positionLocation);
223*8975f5c5SAndroid Build Coastguard Worker 
224*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
225*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
226*8975f5c5SAndroid Build Coastguard Worker 
227*8975f5c5SAndroid Build Coastguard Worker         glDeleteProgram(m2DProgram);
228*8975f5c5SAndroid Build Coastguard Worker     }
229*8975f5c5SAndroid Build Coastguard Worker 
checkPixelsUsingGL()230*8975f5c5SAndroid Build Coastguard Worker     void checkPixelsUsingGL()
231*8975f5c5SAndroid Build Coastguard Worker     {
232*8975f5c5SAndroid Build Coastguard Worker         // Note that the texture is in BGRA format
233*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);                                  // Red
234*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(mWindowWidth - 1, 0, 0, 255, 0, 255);                   // Green
235*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(0, mWindowWidth - 1, 0, 0, 255, 255);                   // Blue
236*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_EQ(mWindowWidth - 1, mWindowWidth - 1, 255, 255, 0, 255);  // Red + green
237*8975f5c5SAndroid Build Coastguard Worker     }
238*8975f5c5SAndroid Build Coastguard Worker 
checkPixelsUsingD3D(bool usingPresentPathFast)239*8975f5c5SAndroid Build Coastguard Worker     void checkPixelsUsingD3D(bool usingPresentPathFast)
240*8975f5c5SAndroid Build Coastguard Worker     {
241*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, mOffscreenSurfaceD3D11Texture);
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker         D3D11_TEXTURE2D_DESC textureDesc = {0};
244*8975f5c5SAndroid Build Coastguard Worker         ID3D11Device *device;
245*8975f5c5SAndroid Build Coastguard Worker         ID3D11DeviceContext *context;
246*8975f5c5SAndroid Build Coastguard Worker         mOffscreenSurfaceD3D11Texture->GetDesc(&textureDesc);
247*8975f5c5SAndroid Build Coastguard Worker         mOffscreenSurfaceD3D11Texture->GetDevice(&device);
248*8975f5c5SAndroid Build Coastguard Worker         device->GetImmediateContext(&context);
249*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, device);
250*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(nullptr, context);
251*8975f5c5SAndroid Build Coastguard Worker 
252*8975f5c5SAndroid Build Coastguard Worker         textureDesc.CPUAccessFlags  = D3D11_CPU_ACCESS_READ;
253*8975f5c5SAndroid Build Coastguard Worker         textureDesc.Usage           = D3D11_USAGE_STAGING;
254*8975f5c5SAndroid Build Coastguard Worker         textureDesc.BindFlags       = 0;
255*8975f5c5SAndroid Build Coastguard Worker         textureDesc.MiscFlags       = 0;
256*8975f5c5SAndroid Build Coastguard Worker         ID3D11Texture2D *cpuTexture = nullptr;
257*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(SUCCEEDED(device->CreateTexture2D(&textureDesc, nullptr, &cpuTexture)));
258*8975f5c5SAndroid Build Coastguard Worker 
259*8975f5c5SAndroid Build Coastguard Worker         context->CopyResource(cpuTexture, mOffscreenSurfaceD3D11Texture);
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker         D3D11_MAPPED_SUBRESOURCE mappedSubresource;
262*8975f5c5SAndroid Build Coastguard Worker         context->Map(cpuTexture, 0, D3D11_MAP_READ, 0, &mappedSubresource);
263*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(static_cast<UINT>(mWindowWidth * 4), mappedSubresource.RowPitch);
264*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(static_cast<UINT>(mWindowWidth * mWindowWidth * 4), mappedSubresource.DepthPitch);
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker         angle::GLColor *byteData = reinterpret_cast<angle::GLColor *>(mappedSubresource.pData);
267*8975f5c5SAndroid Build Coastguard Worker 
268*8975f5c5SAndroid Build Coastguard Worker         // Note that the texture is in BGRA format, although the GLColor struct is RGBA
269*8975f5c5SAndroid Build Coastguard Worker         GLColor expectedTopLeftPixel     = GLColor(0, 0, 255, 255);    // Red
270*8975f5c5SAndroid Build Coastguard Worker         GLColor expectedTopRightPixel    = GLColor(0, 255, 0, 255);    // Green
271*8975f5c5SAndroid Build Coastguard Worker         GLColor expectedBottomLeftPixel  = GLColor(255, 0, 0, 255);    // Blue
272*8975f5c5SAndroid Build Coastguard Worker         GLColor expectedBottomRightPixel = GLColor(0, 255, 255, 255);  // Red + Green
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker         if (usingPresentPathFast)
275*8975f5c5SAndroid Build Coastguard Worker         {
276*8975f5c5SAndroid Build Coastguard Worker             // Invert the expected values
277*8975f5c5SAndroid Build Coastguard Worker             GLColor tempTopLeft      = expectedTopLeftPixel;
278*8975f5c5SAndroid Build Coastguard Worker             GLColor tempTopRight     = expectedTopRightPixel;
279*8975f5c5SAndroid Build Coastguard Worker             expectedTopLeftPixel     = expectedBottomLeftPixel;
280*8975f5c5SAndroid Build Coastguard Worker             expectedTopRightPixel    = expectedBottomRightPixel;
281*8975f5c5SAndroid Build Coastguard Worker             expectedBottomLeftPixel  = tempTopLeft;
282*8975f5c5SAndroid Build Coastguard Worker             expectedBottomRightPixel = tempTopRight;
283*8975f5c5SAndroid Build Coastguard Worker         }
284*8975f5c5SAndroid Build Coastguard Worker 
285*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(expectedTopLeftPixel, byteData[0]);
286*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(expectedTopRightPixel, byteData[(mWindowWidth - 1)]);
287*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(expectedBottomLeftPixel, byteData[(mWindowWidth - 1) * mWindowWidth]);
288*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(expectedBottomRightPixel,
289*8975f5c5SAndroid Build Coastguard Worker                   byteData[(mWindowWidth - 1) * mWindowWidth + (mWindowWidth - 1)]);
290*8975f5c5SAndroid Build Coastguard Worker 
291*8975f5c5SAndroid Build Coastguard Worker         context->Unmap(cpuTexture, 0);
292*8975f5c5SAndroid Build Coastguard Worker         SafeRelease(cpuTexture);
293*8975f5c5SAndroid Build Coastguard Worker         SafeRelease(device);
294*8975f5c5SAndroid Build Coastguard Worker         SafeRelease(context);
295*8975f5c5SAndroid Build Coastguard Worker     }
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker     EGLDisplay mDisplay;
298*8975f5c5SAndroid Build Coastguard Worker     EGLContext mContext;
299*8975f5c5SAndroid Build Coastguard Worker     EGLSurface mSurface;
300*8975f5c5SAndroid Build Coastguard Worker     ID3D11Texture2D *mOffscreenSurfaceD3D11Texture;
301*8975f5c5SAndroid Build Coastguard Worker     EGLConfig mConfig;
302*8975f5c5SAndroid Build Coastguard Worker     OSWindow *mOSWindow;
303*8975f5c5SAndroid Build Coastguard Worker     GLint mWindowWidth;
304*8975f5c5SAndroid Build Coastguard Worker };
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker // Test that rendering basic content onto a window surface when present path fast
307*8975f5c5SAndroid Build Coastguard Worker // is enabled works as expected
TEST_P(EGLPresentPathD3D11,WindowPresentPathFast)308*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPresentPathD3D11, WindowPresentPathFast)
309*8975f5c5SAndroid Build Coastguard Worker {
310*8975f5c5SAndroid Build Coastguard Worker     initializeEGL(true);
311*8975f5c5SAndroid Build Coastguard Worker     createWindowSurface();
312*8975f5c5SAndroid Build Coastguard Worker     makeCurrent();
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker     drawQuadUsingGL();
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker     checkPixelsUsingGL();
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker // Test that rendering basic content onto a client buffer surface when present path fast
320*8975f5c5SAndroid Build Coastguard Worker // works as expected, and is also oriented the correct way around
TEST_P(EGLPresentPathD3D11,ClientBufferPresentPathFast)321*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPresentPathD3D11, ClientBufferPresentPathFast)
322*8975f5c5SAndroid Build Coastguard Worker {
323*8975f5c5SAndroid Build Coastguard Worker     initializeEGL(true);
324*8975f5c5SAndroid Build Coastguard Worker     createPbufferFromClientBufferSurface();
325*8975f5c5SAndroid Build Coastguard Worker     makeCurrent();
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     drawQuadUsingGL();
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     checkPixelsUsingGL();
330*8975f5c5SAndroid Build Coastguard Worker     checkPixelsUsingD3D(true);
331*8975f5c5SAndroid Build Coastguard Worker }
332*8975f5c5SAndroid Build Coastguard Worker 
333*8975f5c5SAndroid Build Coastguard Worker // Test that rendering basic content onto a window surface when present path fast
334*8975f5c5SAndroid Build Coastguard Worker // is disabled works as expected
TEST_P(EGLPresentPathD3D11,WindowPresentPathCopy)335*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPresentPathD3D11, WindowPresentPathCopy)
336*8975f5c5SAndroid Build Coastguard Worker {
337*8975f5c5SAndroid Build Coastguard Worker     initializeEGL(false);
338*8975f5c5SAndroid Build Coastguard Worker     createWindowSurface();
339*8975f5c5SAndroid Build Coastguard Worker     makeCurrent();
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     drawQuadUsingGL();
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker     checkPixelsUsingGL();
344*8975f5c5SAndroid Build Coastguard Worker }
345*8975f5c5SAndroid Build Coastguard Worker 
346*8975f5c5SAndroid Build Coastguard Worker // Test that rendering basic content onto a client buffer surface when present path
347*8975f5c5SAndroid Build Coastguard Worker // fast is disabled works as expected, and is also oriented the correct way around
TEST_P(EGLPresentPathD3D11,ClientBufferPresentPathCopy)348*8975f5c5SAndroid Build Coastguard Worker TEST_P(EGLPresentPathD3D11, ClientBufferPresentPathCopy)
349*8975f5c5SAndroid Build Coastguard Worker {
350*8975f5c5SAndroid Build Coastguard Worker     initializeEGL(false);
351*8975f5c5SAndroid Build Coastguard Worker     createPbufferFromClientBufferSurface();
352*8975f5c5SAndroid Build Coastguard Worker     makeCurrent();
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker     drawQuadUsingGL();
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker     checkPixelsUsingGL();
357*8975f5c5SAndroid Build Coastguard Worker     checkPixelsUsingD3D(false);
358*8975f5c5SAndroid Build Coastguard Worker }
359*8975f5c5SAndroid Build Coastguard Worker 
360*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(EGLPresentPathD3D11, WithNoFixture(ES2_D3D11()));
361