File indexing completed on 2024-11-10 04:56:53
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2017 Martin Flöser <mgraesslin@kde.org> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #include "egl_context_attribute_builder.h" 0010 #include <epoxy/egl.h> 0011 0012 namespace KWin 0013 { 0014 std::vector<int> EglContextAttributeBuilder::build() const 0015 { 0016 std::vector<int> attribs; 0017 if (isVersionRequested()) { 0018 attribs.emplace_back(EGL_CONTEXT_MAJOR_VERSION_KHR); 0019 attribs.emplace_back(majorVersion()); 0020 attribs.emplace_back(EGL_CONTEXT_MINOR_VERSION_KHR); 0021 attribs.emplace_back(minorVersion()); 0022 } 0023 int contextFlags = 0; 0024 if (isRobust()) { 0025 attribs.emplace_back(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR); 0026 attribs.emplace_back(EGL_LOSE_CONTEXT_ON_RESET_KHR); 0027 contextFlags |= EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR; 0028 if (isResetOnVideoMemoryPurge()) { 0029 attribs.emplace_back(EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV); 0030 attribs.emplace_back(GL_TRUE); 0031 } 0032 } 0033 if (isForwardCompatible()) { 0034 contextFlags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR; 0035 } 0036 if (contextFlags != 0) { 0037 attribs.emplace_back(EGL_CONTEXT_FLAGS_KHR); 0038 attribs.emplace_back(contextFlags); 0039 } 0040 if (isCoreProfile() || isCompatibilityProfile()) { 0041 attribs.emplace_back(EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR); 0042 if (isCoreProfile()) { 0043 attribs.emplace_back(EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR); 0044 } else if (isCompatibilityProfile()) { 0045 attribs.emplace_back(EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR); 0046 } 0047 } 0048 if (isHighPriority()) { 0049 attribs.emplace_back(EGL_CONTEXT_PRIORITY_LEVEL_IMG); 0050 attribs.emplace_back(EGL_CONTEXT_PRIORITY_HIGH_IMG); 0051 } 0052 attribs.emplace_back(EGL_NONE); 0053 return attribs; 0054 } 0055 0056 std::vector<int> EglOpenGLESContextAttributeBuilder::build() const 0057 { 0058 std::vector<int> attribs; 0059 attribs.emplace_back(EGL_CONTEXT_CLIENT_VERSION); 0060 attribs.emplace_back(majorVersion()); 0061 if (isRobust()) { 0062 attribs.emplace_back(EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT); 0063 attribs.emplace_back(EGL_TRUE); 0064 attribs.emplace_back(EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT); 0065 attribs.emplace_back(EGL_LOSE_CONTEXT_ON_RESET_EXT); 0066 if (isResetOnVideoMemoryPurge()) { 0067 attribs.emplace_back(EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV); 0068 attribs.emplace_back(GL_TRUE); 0069 } 0070 } 0071 if (isHighPriority()) { 0072 attribs.emplace_back(EGL_CONTEXT_PRIORITY_LEVEL_IMG); 0073 attribs.emplace_back(EGL_CONTEXT_PRIORITY_HIGH_IMG); 0074 } 0075 attribs.emplace_back(EGL_NONE); 0076 return attribs; 0077 } 0078 0079 }