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