Fix Win32Window::takeScreenshot.

Several parts of this function were incorrectly checking for errors or
passing the wrong parameters.  If screenshotting fails, throw an exception
in dEQP so that it is converted to a test failure instead of hanging the
test.

BUG=angleproject:2075

Change-Id: I19b55b273d0d3f1b47c1dac6affca69de8db21e0
Reviewed-on: https://chromium-review.googlesource.com/587300
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
This commit is contained in:
Geoff Lang 2017-07-26 14:39:27 -04:00 коммит произвёл Commit Bot
Родитель b5cc1198b8
Коммит 5505bdc707
3 изменённых файлов: 12 добавлений и 25 удалений

Просмотреть файл

@ -42,7 +42,6 @@
1662 WIN : dEQP-EGL.functional.render.multi_context.gles2_gles3.other = FAIL
1662 WIN : dEQP-EGL.functional.render.multi_thread.gles2.other = FAIL
1662 WIN : dEQP-EGL.functional.render.multi_thread.gles3.other = FAIL
1662 WIN : dEQP-EGL.functional.swap_buffers.other = FAIL
1662 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.other_clear = FAIL
1662 WIN : dEQP-EGL.functional.native_coord_mapping.native_window.other_render = FAIL
1662 WIN : dEQP-EGL.functional.query_context.get_current_context.other = FAIL
@ -206,21 +205,6 @@
1340 WIN : dEQP-EGL.functional.negative_api.get_display = FAIL
1340 WIN : dEQP-EGL.functional.negative_api.surface_attrib = SKIP
1340 WIN : dEQP-EGL.functional.negative_api.swap_interval = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgb565_no_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgb565_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgb565_depth_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgb888_no_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgb888_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgb888_depth_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba4444_no_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba4444_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba4444_depth_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba5551_no_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba5551_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba5551_depth_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba8888_no_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba8888_depth_no_stencil = FAIL
1340 WIN : dEQP-EGL.functional.swap_buffers.rgba8888_depth_stencil = FAIL
1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_no_depth_no_stencil_clear = FAIL
1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_no_depth_no_stencil_render = FAIL
1340 WIN : dEQP-EGL.functional.native_color_mapping.native_window.rgb565_depth_no_stencil_clear = FAIL

Просмотреть файл

@ -302,9 +302,10 @@ void NativeWindow::setSurfaceSize(IVec2 size)
void NativeWindow::readScreenPixels(tcu::TextureLevel *dst) const
{
dst->setStorage(TextureFormat(TextureFormat::BGRA, TextureFormat::UNORM_INT8), mWindow->getWidth(), mWindow->getHeight());
bool success = mWindow->takeScreenshot(reinterpret_cast<uint8_t*>(dst->getAccess().getDataPtr()));
DE_ASSERT(success);
DE_UNREF(success);
if (!mWindow->takeScreenshot(reinterpret_cast<uint8_t *>(dst->getAccess().getDataPtr())))
{
throw InternalError("Failed to read screen pixels", DE_NULL, __FILE__, __LINE__);
}
}
} // anonymous

Просмотреть файл

@ -627,7 +627,7 @@ bool Win32Window::takeScreenshot(uint8_t *pixelData)
if (!error)
{
screenDC = GetDC(nullptr);
screenDC = GetDC(HWND_DESKTOP);
error = screenDC == nullptr;
}
@ -649,18 +649,20 @@ bool Win32Window::takeScreenshot(uint8_t *pixelData)
error = tmpBitmap == nullptr;
}
RECT rect = {0, 0, 0, 0};
POINT topLeft = {0, 0};
if (!error)
{
MapWindowPoints(mNativeWindow, nullptr, reinterpret_cast<LPPOINT>(&rect), 0);
error = (MapWindowPoints(mNativeWindow, HWND_DESKTOP, &topLeft, 1) == 0);
}
if (!error)
{
error = SelectObject(tmpDC, tmpBitmap) == nullptr;
}
if (!error)
{
error =
BitBlt(tmpDC, 0, 0, mWidth, mHeight, screenDC, rect.left, rect.top, SRCCOPY) == TRUE;
error = BitBlt(tmpDC, 0, 0, mWidth, mHeight, screenDC, topLeft.x, topLeft.y, SRCCOPY) == 0;
}
if (!error)
@ -679,7 +681,7 @@ bool Win32Window::takeScreenshot(uint8_t *pixelData)
bitmapInfo.biClrImportant = 0;
int getBitsResult = GetDIBits(screenDC, tmpBitmap, 0, mHeight, pixelData,
reinterpret_cast<BITMAPINFO *>(&bitmapInfo), DIB_RGB_COLORS);
error = getBitsResult != 0;
error = (getBitsResult == 0);
}
if (tmpBitmap != nullptr)