Edit

kc3-lang/angle/src/tests/gl_tests/QueryDisplayAttribTest.cpp

Branch :

  • Show log

    Commit

  • Author : Corentin Wallez
    Date : 2015-05-14 11:07:48
    Hash : d3970de4
    Message : Move ANGLETest back in test_utils, leaving a proxy header for Chromium BUG=angleproject:892 Change-Id: Ibd494813be87e996096077d6e208cc92461b8f49 Reviewed-on: https://chromium-review.googlesource.com/271154 Reviewed-by: Jamie Madill <jmadill@chromium.org> Tested-by: Corentin Wallez <cwallez@chromium.org>

  • src/tests/gl_tests/QueryDisplayAttribTest.cpp
  • //
    // Copyright 2015 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.
    //
    
    #ifndef ANGLE_ENABLE_D3D9
    #define ANGLE_ENABLE_D3D9
    #endif
    
    #ifndef ANGLE_ENABLE_D3D11
    #define ANGLE_ENABLE_D3D11
    #endif
    
    #include "test_utils/ANGLETest.h"
    #include "com_utils.h"
    
    using namespace angle;
    
    class QueryDisplayAttributeTest : public ANGLETest
    {
      protected:
        QueryDisplayAttributeTest()
        {
            mQueryDisplayAttribEXT = nullptr;
            mQueryDeviceAttribEXT = nullptr;
            mQueryDeviceStringEXT = nullptr;
        }
    
        void SetUp() override
        {
            ANGLETest::SetUp();
    
            const char *extensionString = static_cast<const char*>(eglQueryString(getEGLWindow()->getDisplay(), EGL_EXTENSIONS));
            if (strstr(extensionString, "EGL_EXT_device_query"))
            {
                mQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)eglGetProcAddress("eglQueryDisplayAttribEXT");
                mQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)eglGetProcAddress("eglQueryDeviceAttribEXT");
                mQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)eglGetProcAddress("eglQueryDeviceStringEXT");
            }
    
            if (!mQueryDeviceStringEXT)
            {
                FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDeviceStringEXT was not found";
            }
    
            if (!mQueryDisplayAttribEXT)
            {
                FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDisplayAttribEXT was not found";
            }
    
            if (!mQueryDeviceAttribEXT)
            {
                FAIL() << "ANGLE extension EGL_EXT_device_query export eglQueryDeviceAttribEXT was not found";
            }
    
            EGLAttrib angleDevice = 0;
            EXPECT_EQ(EGL_TRUE, mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
            extensionString = static_cast<const char*>(mQueryDeviceStringEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_EXTENSIONS));
            if (strstr(extensionString, "EGL_ANGLE_device_d3d") == NULL)
            {
                FAIL() << "ANGLE extension EGL_ANGLE_device_d3d was not found";
            }
        }
    
        void TearDown() override
        {
            ANGLETest::TearDown();
        }
    
        PFNEGLQUERYDISPLAYATTRIBEXTPROC mQueryDisplayAttribEXT;
        PFNEGLQUERYDEVICEATTRIBEXTPROC mQueryDeviceAttribEXT;
        PFNEGLQUERYDEVICESTRINGEXTPROC mQueryDeviceStringEXT;
    };
    
    // This test attempts to obtain a D3D11 device and a D3D9 device using the eglQueryDeviceAttribEXT function.
    // If the test is configured to use D3D11 then it should succeed to obtain a D3D11 device.
    // If the test is confitured to use D3D9, then it should succeed to obtain a D3D9 device.
    TEST_P(QueryDisplayAttributeTest, QueryDevice)
    {
        EGLAttrib device = 0;
        EGLAttrib angleDevice = 0;
        if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
        {
            EXPECT_EQ(EGL_TRUE, mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
            EXPECT_EQ(EGL_TRUE, mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_D3D11_DEVICE_ANGLE, &device));
            ID3D11Device *d3d11Device = reinterpret_cast<ID3D11Device*>(device);
            IDXGIDevice *dxgiDevice = DynamicCastComObject<IDXGIDevice>(d3d11Device);
            EXPECT_TRUE(dxgiDevice != nullptr);
            SafeRelease(dxgiDevice);
        }
    
        if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
        {
            EXPECT_EQ(EGL_TRUE, mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
            EXPECT_EQ(EGL_TRUE, mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_D3D9_DEVICE_ANGLE, &device));
            IDirect3DDevice9 *d3d9Device = reinterpret_cast<IDirect3DDevice9*>(device);
            IDirect3D9 *d3d9 = nullptr;
            EXPECT_EQ(S_OK, d3d9Device->GetDirect3D(&d3d9));
            EXPECT_TRUE(d3d9 != nullptr);
            SafeRelease(d3d9);
        }
    }
    
    // This test attempts to obtain a D3D11 device from a D3D9 configured system and a D3D9 device from
    // a D3D11 configured system using the eglQueryDeviceAttribEXT function.
    // If the test is configured to use D3D11 then it should fail to obtain a D3D11 device.
    // If the test is confitured to use D3D9, then it should fail to obtain a D3D9 device.
    TEST_P(QueryDisplayAttributeTest, QueryDeviceBadAttrbiute)
    {
        EGLAttrib device = 0;
        EGLAttrib angleDevice = 0;
        if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
        {
            EXPECT_EQ(EGL_TRUE, mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
            EXPECT_EQ(EGL_FALSE, mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_D3D9_DEVICE_ANGLE, &device));
        }
    
        if (getPlatformRenderer() == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
        {
            EXPECT_EQ(EGL_TRUE, mQueryDisplayAttribEXT(getEGLWindow()->getDisplay(), EGL_DEVICE_EXT, &angleDevice));
            EXPECT_EQ(EGL_FALSE, mQueryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_D3D11_DEVICE_ANGLE, &device));
        }
    }
    
    // Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
    ANGLE_INSTANTIATE_TEST(QueryDisplayAttributeTest, ES2_D3D9(), ES2_D3D11());