xref: /aosp_15_r20/external/deqp/external/openglcts/modules/common/glcConfigListWGL.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 /*-------------------------------------------------------------------------
2  * OpenGL Conformance Test Suite
3  * -----------------------------
4  *
5  * Copyright (c) 2016 Google Inc.
6  * Copyright (c) 2016 The Khronos Group Inc.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */ /*!
21  * \file
22  * \brief CTS rendering configuration list utility.
23  */ /*-------------------------------------------------------------------*/
24 
25 #include "deUniquePtr.hpp"
26 #include "glcConfigList.hpp"
27 
28 #include <typeinfo>
29 
30 #if defined(GLCTS_SUPPORT_WGL)
31 #include "tcuWGL.hpp"
32 #include "tcuWin32Platform.hpp"
33 #include "tcuWin32Window.hpp"
34 #endif
35 
36 namespace glcts
37 {
38 
39 #if defined(GLCTS_SUPPORT_WGL)
40 
getDefaultWglConfigList(tcu::win32::Platform & wglPlatform,glu::ApiType type,ConfigList & configList)41 static void getDefaultWglConfigList(tcu::win32::Platform &wglPlatform, glu::ApiType type, ConfigList &configList)
42 {
43     const HINSTANCE instance = GetModuleHandle(DE_NULL);
44     const tcu::wgl::Core &wgl(instance);
45     const tcu::win32::Window tmpWindow(instance, 1, 1);
46     const std::vector<int> pixelFormats = wgl.getPixelFormats(tmpWindow.getDeviceContext());
47 
48     DE_UNREF(type); // \todo [2013-09-16 pyry] Check for support.
49 
50     for (std::vector<int>::const_iterator fmtIter = pixelFormats.begin(); fmtIter != pixelFormats.end(); ++fmtIter)
51     {
52         const int pixelFormat                   = *fmtIter;
53         const tcu::wgl::PixelFormatInfo fmtInfo = wgl.getPixelFormatInfo(tmpWindow.getDeviceContext(), pixelFormat);
54 
55         if (!tcu::wgl::isSupportedByTests(fmtInfo))
56             continue;
57 
58         bool isAOSPOk = (fmtInfo.surfaceTypes & tcu::wgl::PixelFormatInfo::SURFACE_WINDOW) && fmtInfo.supportOpenGL &&
59                         fmtInfo.pixelType == tcu::wgl::PixelFormatInfo::PIXELTYPE_RGBA;
60         bool isOk = isAOSPOk && (fmtInfo.sampleBuffers == 0);
61 
62         if (isOk && (type.getProfile() == glu::PROFILE_ES) &&
63             (fmtInfo.redBits > 8 || fmtInfo.greenBits > 8 || fmtInfo.blueBits > 8 || fmtInfo.alphaBits > 8))
64         {
65             // The OpenGL ES tests use of glReadPixels is not compatible with default framebufer pixel
66             // formats with more than 8-bits per pixel component.
67             isOk = false;
68         }
69 
70         if (isOk && (type.getProfile() == glu::PROFILE_ES) && fmtInfo.sRGB)
71         {
72             // The OpenGL ES tests don't interact correctly with a default framebuffer
73             // in the sRGB color space.
74             isOk = false;
75         }
76 
77         if (isAOSPOk)
78         {
79             configList.aospConfigs.push_back(AOSPConfig(
80                 CONFIGTYPE_WGL, pixelFormat, SURFACETYPE_WINDOW, fmtInfo.redBits, fmtInfo.greenBits, fmtInfo.blueBits,
81                 fmtInfo.alphaBits, fmtInfo.depthBits, fmtInfo.stencilBits, fmtInfo.samples));
82         }
83 
84         if (isOk)
85         {
86             configList.configs.push_back(Config(CONFIGTYPE_WGL, pixelFormat, SURFACETYPE_WINDOW));
87         }
88         else
89         {
90             configList.excludedConfigs.push_back(
91                 ExcludedConfig(CONFIGTYPE_WGL, pixelFormat, EXCLUDEREASON_NOT_COMPATIBLE));
92         }
93     }
94 }
95 
getConfigListWGL(tcu::Platform & platform,glu::ApiType type,ConfigList & configList)96 void getConfigListWGL(tcu::Platform &platform, glu::ApiType type, ConfigList &configList)
97 {
98     try
99     {
100         tcu::win32::Platform &wglPlatform = dynamic_cast<tcu::win32::Platform &>(platform);
101         getDefaultWglConfigList(wglPlatform, type, configList);
102     }
103     catch (const std::bad_cast &)
104     {
105         throw tcu::Exception("Platform is not tcu::WGLPlatform");
106     }
107 }
108 
109 #else
110 
111 void getConfigListWGL(tcu::Platform &, glu::ApiType, ConfigList &)
112 {
113     throw tcu::Exception("WGL is not supported on this OS");
114 }
115 
116 #endif
117 
118 } // namespace glcts
119