Warning, /graphics/krita/3rdparty/ext_googleangle/02-patches_krita/0015-Implement-openGL-surface-color-space-selection-in-An.patch is written in an unsupported language. File is not indexed.
0001 From 0fb8bddb74a58b51bad12a6188f24d13cba2c7f4 Mon Sep 17 00:00:00 2001 0002 From: Dmitry Kazakov <dimula73@gmail.com> 0003 Date: Sat, 8 Dec 2018 15:35:43 +0300 0004 Subject: [PATCH 15/17] Implement openGL surface color space selection in Angle 0005 0006 WARNING: this patch actually means that the library must be build on 0007 the system with at least DXGI 1.4 (DirectX 12 API) present 0008 in SDK. Mingw64 7.3 supports that. 0009 0010 1) D3D11 implementation of angle now supports GL_RGB10_A2 format 0011 0012 2) Technically, Angle's EGL implementation now supports the following 0013 display extensions: 0014 * EGL_KHR_gl_colorspace 0015 * EGL_EXT_gl_colorspace_scrgb_linear 0016 * EGL_EXT_gl_colorspace_bt2020_pq 0017 0018 3) D3D11 implementation of angle now supports GL_COLOR_SPACE attribute, 0019 which allows selection one of four color modes: 0020 * Linear --- just pass-through data to GPU 0021 * sRGB --- p709-g22 color space. WARNING: in 8-bit mode the system 0022 becomes clever and automatically converts linear framebuffer 0023 attachments to sRGB space, as per EGL_KHR_gl_colorspace definition. 0024 It is not possible to select sRGB without this extra "feature". 0025 * scRGB --- p709-g10 color space. This mode is the only mode 0026 supported in f16-bit mode (and it is also not supported in other 0027 bit depths). 0028 * bt2020-pq --- p2020-pq color space. Supported only in 10-bit mode. 0029 0030 5) SwapChain is now created in DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL mode: 0031 * because non-flip mode is considered deprecated and HDR is not 0032 supported in it; 0033 * because in flip-discard mode partial updates from 0034 SwapChain11::present() are not supported and return an error, 0035 which is never checked :) 0036 0037 6) As a fallback, SwapChain uses old DXGI_SWAP_EFFECT_DISCARD, because 0038 flip modes are not available on Windows 7 and such old systems. 0039 0040 Notes: 0041 0042 eglCreatePixmapSurface() is not implemented in Angle, so the support is 0043 not added. 0044 0045 eglCreatePlatformWindowSurface() and eglCreatePlatformPixmapSurface() 0046 do not have support for color spaces according to the extension wording 0047 (and they are also not supported by Angle :) ) 0048 0049 Change-Id: I68204a5db6bbd7066a83a8d1d021ce76cd1cf6f6 0050 --- 0051 src/libANGLE/Caps.cpp | 1 + 0052 src/libANGLE/Caps.h | 3 + 0053 src/libANGLE/formatutils.h | 1 + 0054 src/libANGLE/renderer/d3d/RendererD3D.h | 3 +- 0055 src/libANGLE/renderer/d3d/SurfaceD3D.cpp | 26 +++++- 0056 src/libANGLE/renderer/d3d/SurfaceD3D.h | 1 + 0057 .../renderer/d3d/d3d11/Renderer11.cpp | 16 +++- 0058 src/libANGLE/renderer/d3d/d3d11/Renderer11.h | 4 +- 0059 .../renderer/d3d/d3d11/SwapChain11.cpp | 90 ++++++++++++++++++- 0060 src/libANGLE/renderer/d3d/d3d11/SwapChain11.h | 4 +- 0061 .../d3d/d3d11/win32/NativeWindow11Win32.cpp | 19 +++- 0062 src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp | 4 +- 0063 src/libANGLE/renderer/d3d/d3d9/Renderer9.h | 3 +- 0064 src/libANGLE/validationEGL.cpp | 8 ++ 0065 14 files changed, 170 insertions(+), 13 deletions(-) 0066 0067 diff --git a/src/libANGLE/Caps.cpp b/src/libANGLE/Caps.cpp 0068 index f4c1beed2..a6e80b102 100644 0069 --- a/src/libANGLE/Caps.cpp 0070 +++ b/src/libANGLE/Caps.cpp 0071 @@ -1245,6 +1245,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const 0072 InsertExtensionString("EGL_EXT_gl_colorspace_display_p3", glColorspaceDisplayP3, &extensionStrings); 0073 InsertExtensionString("EGL_EXT_gl_colorspace_display_p3_linear", glColorspaceDisplayP3Linear, &extensionStrings); 0074 InsertExtensionString("EGL_EXT_gl_colorspace_display_p3_passthrough", glColorspaceDisplayP3Passthrough, &extensionStrings); 0075 + InsertExtensionString("EGL_EXT_gl_colorspace_bt2020_pq", glColorspaceBt2020PQ, &extensionStrings); 0076 InsertExtensionString("EGL_KHR_gl_texture_2D_image", glTexture2DImage, &extensionStrings); 0077 InsertExtensionString("EGL_KHR_gl_texture_cubemap_image", glTextureCubemapImage, &extensionStrings); 0078 InsertExtensionString("EGL_KHR_gl_texture_3D_image", glTexture3DImage, &extensionStrings); 0079 diff --git a/src/libANGLE/Caps.h b/src/libANGLE/Caps.h 0080 index 13429ac2d..c104491f6 100644 0081 --- a/src/libANGLE/Caps.h 0082 +++ b/src/libANGLE/Caps.h 0083 @@ -602,6 +602,9 @@ struct DisplayExtensions 0084 // EGL_EXT_gl_colorspace_display_p3_passthrough 0085 bool glColorspaceDisplayP3Passthrough = false; 0086 0087 + // EGL_EXT_gl_colorspace_bt2020_pq 0088 + bool glColorspaceBt2020PQ = false; 0089 + 0090 // EGL_ANDROID_framebuffer_target 0091 bool framebufferTargetANDROID = false; 0092 0093 diff --git a/src/libANGLE/formatutils.h b/src/libANGLE/formatutils.h 0094 index c53a25151..cd411bae8 100644 0095 --- a/src/libANGLE/formatutils.h 0096 +++ b/src/libANGLE/formatutils.h 0097 @@ -87,6 +87,7 @@ ANGLE_INLINE bool ColorspaceFormatOverride(const EGLenum colorspace, GLenum *ren 0098 case EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT: // App, not the HW, will specify the 0099 // transfer function 0100 case EGL_GL_COLORSPACE_SCRGB_EXT: // App, not the HW, will specify the transfer function 0101 + case EGL_GL_COLORSPACE_BT2020_PQ_EXT: // App, not the HW, will specify the transfer function 0102 // No translation 0103 return true; 0104 case EGL_GL_COLORSPACE_SRGB_KHR: 0105 diff --git a/src/libANGLE/renderer/d3d/RendererD3D.h b/src/libANGLE/renderer/d3d/RendererD3D.h 0106 index d681e5b7e..f2874242e 100644 0107 --- a/src/libANGLE/renderer/d3d/RendererD3D.h 0108 +++ b/src/libANGLE/renderer/d3d/RendererD3D.h 0109 @@ -182,7 +182,8 @@ class RendererD3D : public BufferFactoryD3D 0110 GLenum backBufferFormat, 0111 GLenum depthBufferFormat, 0112 EGLint orientation, 0113 - EGLint samples) = 0; 0114 + EGLint samples, 0115 + EGLint colorSpace) = 0; 0116 virtual egl::Error getD3DTextureInfo(const egl::Config *configuration, 0117 IUnknown *d3dTexture, 0118 const egl::AttributeMap &attribs, 0119 diff --git a/src/libANGLE/renderer/d3d/SurfaceD3D.cpp b/src/libANGLE/renderer/d3d/SurfaceD3D.cpp 0120 index 6fc42139a..a9950ab14 100644 0121 --- a/src/libANGLE/renderer/d3d/SurfaceD3D.cpp 0122 +++ b/src/libANGLE/renderer/d3d/SurfaceD3D.cpp 0123 @@ -24,6 +24,27 @@ 0124 namespace rx 0125 { 0126 0127 +GLenum renderTargetFormatFromColorSpace(egl::Display *display, GLenum baseFormat, EGLint colorSpace) 0128 +{ 0129 + GLenum result = baseFormat; 0130 + 0131 + /** 0132 + * If sRGB extension is supported, we should change the surface format 0133 + * to a specific one that does support automated gamma conversion. 0134 + * 0135 + * TODO: openGL doesn't support BGRA-sRGB texture format, so creation of 0136 + * textures in this format technically is not supported! 0137 + */ 0138 + if (display->getExtensions().glColorspace && 0139 + baseFormat == GL_RGBA8_OES && 0140 + colorSpace == EGL_GL_COLORSPACE_SRGB_KHR) 0141 + { 0142 + result = GL_SRGB8_ALPHA8; 0143 + } 0144 + 0145 + return result; 0146 +} 0147 + 0148 SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state, 0149 RendererD3D *renderer, 0150 egl::Display *display, 0151 @@ -38,7 +59,8 @@ SurfaceD3D::SurfaceD3D(const egl::SurfaceState &state, 0152 mFixedWidth(0), 0153 mFixedHeight(0), 0154 mOrientation(static_cast<EGLint>(attribs.get(EGL_SURFACE_ORIENTATION_ANGLE, 0))), 0155 - mRenderTargetFormat(state.config->renderTargetFormat), 0156 + mColorSpace(static_cast<EGLint>(attribs.get(EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_LINEAR))), 0157 + mRenderTargetFormat(renderTargetFormatFromColorSpace(display, state.config->renderTargetFormat, mColorSpace)), 0158 mDepthStencilFormat(state.config->depthStencilFormat), 0159 mColorFormat(nullptr), 0160 mSwapChain(nullptr), 0161 @@ -203,7 +225,7 @@ egl::Error SurfaceD3D::resetSwapChain(const egl::Display *display) 0162 0163 mSwapChain = 0164 mRenderer->createSwapChain(mNativeWindow, mShareHandle, mD3DTexture, mRenderTargetFormat, 0165 - mDepthStencilFormat, mOrientation, mState.config->samples); 0166 + mDepthStencilFormat, mOrientation, mState.config->samples, mColorSpace); 0167 if (!mSwapChain) 0168 { 0169 return egl::EglBadAlloc(); 0170 diff --git a/src/libANGLE/renderer/d3d/SurfaceD3D.h b/src/libANGLE/renderer/d3d/SurfaceD3D.h 0171 index c48c8eb49..f0ecb67e7 100644 0172 --- a/src/libANGLE/renderer/d3d/SurfaceD3D.h 0173 +++ b/src/libANGLE/renderer/d3d/SurfaceD3D.h 0174 @@ -93,6 +93,7 @@ class SurfaceD3D : public SurfaceImpl 0175 GLint mFixedWidth; 0176 GLint mFixedHeight; 0177 GLint mOrientation; 0178 + EGLint mColorSpace; 0179 0180 GLenum mRenderTargetFormat; 0181 GLenum mDepthStencilFormat; 0182 diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp 0183 index e89719966..c340b4971 100644 0184 --- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp 0185 +++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp 0186 @@ -429,6 +429,7 @@ Renderer11::Renderer11(egl::Display *display) 0187 mRenderer11DeviceCaps.supportsConstantBufferOffsets = false; 0188 mRenderer11DeviceCaps.supportsVpRtIndexWriteFromVertexShader = false; 0189 mRenderer11DeviceCaps.supportsDXGI1_2 = false; 0190 + mRenderer11DeviceCaps.supportsDXGI1_4 = false; 0191 mRenderer11DeviceCaps.allowES3OnFL10_0 = false; 0192 mRenderer11DeviceCaps.B5G6R5support = 0; 0193 mRenderer11DeviceCaps.B4G4R4A4support = 0; 0194 @@ -1024,6 +1025,7 @@ egl::Error Renderer11::initializeDevice() 0195 0196 // Gather stats on DXGI and D3D feature level 0197 ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.SupportsDXGI1_2", mRenderer11DeviceCaps.supportsDXGI1_2); 0198 + ANGLE_HISTOGRAM_BOOLEAN("GPU.ANGLE.SupportsDXGI1_4", mRenderer11DeviceCaps.supportsDXGI1_4); 0199 0200 ANGLEFeatureLevel angleFeatureLevel = GetANGLEFeatureLevel(mRenderer11DeviceCaps.featureLevel); 0201 0202 @@ -1113,6 +1115,10 @@ void Renderer11::populateRenderer11DeviceCaps() 0203 IDXGIAdapter2 *dxgiAdapter2 = d3d11::DynamicCastComObject<IDXGIAdapter2>(mDxgiAdapter); 0204 mRenderer11DeviceCaps.supportsDXGI1_2 = (dxgiAdapter2 != nullptr); 0205 SafeRelease(dxgiAdapter2); 0206 + 0207 + IDXGIAdapter3 *dxgiAdapter3 = d3d11::DynamicCastComObject<IDXGIAdapter3>(mDxgiAdapter); 0208 + mRenderer11DeviceCaps.supportsDXGI1_4 = (dxgiAdapter3 != nullptr); 0209 + SafeRelease(dxgiAdapter3); 0210 } 0211 0212 gl::SupportedSampleSet Renderer11::generateSampleSetForEGLConfig( 0213 @@ -1358,6 +1364,11 @@ void Renderer11::generateDisplayExtensions(egl::DisplayExtensions *outExtensions 0214 outExtensions->windowsUIComposition = true; 0215 } 0216 #endif 0217 + 0218 + // color space selection supported in DXGI 1.4 only 0219 + outExtensions->glColorspace = mRenderer11DeviceCaps.supportsDXGI1_4; 0220 + outExtensions->glColorspaceScrgbLinear = mRenderer11DeviceCaps.supportsDXGI1_4; 0221 + outExtensions->glColorspaceBt2020PQ = mRenderer11DeviceCaps.supportsDXGI1_4; 0222 } 0223 0224 angle::Result Renderer11::flush(Context11 *context11) 0225 @@ -1708,10 +1719,11 @@ SwapChainD3D *Renderer11::createSwapChain(NativeWindowD3D *nativeWindow, 0226 GLenum backBufferFormat, 0227 GLenum depthBufferFormat, 0228 EGLint orientation, 0229 - EGLint samples) 0230 + EGLint samples, 0231 + EGLint colorSpace) 0232 { 0233 return new SwapChain11(this, GetAs<NativeWindow11>(nativeWindow), shareHandle, d3dTexture, 0234 - backBufferFormat, depthBufferFormat, orientation, samples); 0235 + backBufferFormat, depthBufferFormat, orientation, samples, colorSpace); 0236 } 0237 0238 void *Renderer11::getD3DDevice() 0239 diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h 0240 index 04821c43a..9d8d8fdfd 100644 0241 --- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.h 0242 +++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.h 0243 @@ -49,6 +49,7 @@ struct Renderer11DeviceCaps 0244 0245 D3D_FEATURE_LEVEL featureLevel; 0246 bool supportsDXGI1_2; // Support for DXGI 1.2 0247 + bool supportsDXGI1_4; // Support for DXGI 1.4 0248 bool supportsClearView; // Support for ID3D11DeviceContext1::ClearView 0249 bool supportsConstantBufferOffsets; // Support for Constant buffer offset 0250 bool supportsVpRtIndexWriteFromVertexShader; // VP/RT can be selected in the Vertex Shader 0251 @@ -101,7 +102,8 @@ class Renderer11 : public RendererD3D 0252 GLenum backBufferFormat, 0253 GLenum depthBufferFormat, 0254 EGLint orientation, 0255 - EGLint samples) override; 0256 + EGLint samples, 0257 + EGLint colorSpace) override; 0258 egl::Error getD3DTextureInfo(const egl::Config *configuration, 0259 IUnknown *d3dTexture, 0260 const egl::AttributeMap &attribs, 0261 diff --git a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp 0262 index a82b77b33..c69d84eb5 100644 0263 --- a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp 0264 +++ b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp 0265 @@ -19,6 +19,11 @@ 0266 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h" 0267 #include "libANGLE/trace.h" 0268 0269 +#if 0 0270 +// used only for HDR metadata configuration options 0271 +#include <dxgi1_5.h> 0272 +#endif 0273 + 0274 // Precompiled shaders 0275 #include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthrough2d11vs.h" 0276 #include "libANGLE/renderer/d3d/d3d11/shaders/compiled/passthroughrgba2d11ps.h" 0277 @@ -58,12 +63,14 @@ SwapChain11::SwapChain11(Renderer11 *renderer, 0278 GLenum backBufferFormat, 0279 GLenum depthBufferFormat, 0280 EGLint orientation, 0281 - EGLint samples) 0282 + EGLint samples, 0283 + EGLint colorSpace) 0284 : SwapChainD3D(shareHandle, d3dTexture, backBufferFormat, depthBufferFormat), 0285 mRenderer(renderer), 0286 mWidth(-1), 0287 mHeight(-1), 0288 mOrientation(orientation), 0289 + mColorSpace(colorSpace), 0290 mAppCreatedShareHandle(mShareHandle != nullptr), 0291 mSwapInterval(0), 0292 mPassThroughResourcesInit(false), 0293 @@ -655,10 +662,91 @@ EGLint SwapChain11::reset(DisplayD3D *displayD3D, 0294 mSwapChain1 = d3d11::DynamicCastComObject<IDXGISwapChain1>(mSwapChain); 0295 } 0296 0297 + if (mRenderer->getRenderer11DeviceCaps().supportsDXGI1_4) 0298 + { 0299 + IDXGISwapChain3 *swapChain3 = d3d11::DynamicCastComObject<IDXGISwapChain3>(mSwapChain); 0300 + 0301 + // printf("*** EGL colorSpace: 0x%X\n", mColorSpace); 0302 + // printf("*** EGL format: 0x%X\n", mOffscreenRenderTargetFormat); 0303 + // printf("*** Native format: 0x%X\n", getSwapChainNativeFormat()); 0304 + 0305 + if (mColorSpace != EGL_GL_COLORSPACE_LINEAR_KHR) { 0306 + DXGI_COLOR_SPACE_TYPE nativeColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; 0307 + switch (mColorSpace) 0308 + { 0309 + case EGL_GL_COLORSPACE_SRGB_KHR: 0310 + nativeColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; 0311 + break; 0312 + case EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT: 0313 + nativeColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709; 0314 + break; 0315 + case EGL_GL_COLORSPACE_BT2020_PQ_EXT: 0316 + nativeColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; 0317 + break; 0318 + default: 0319 + ASSERT(0 && "Unsupported colorspace requested"); 0320 + } 0321 + 0322 + // printf("*** Native colorSpace: 0x%X\n", nativeColorSpace); 0323 + 0324 + UINT supported = 0; 0325 + hr = swapChain3->CheckColorSpaceSupport(nativeColorSpace, &supported); 0326 + ASSERT(SUCCEEDED(hr)); 0327 + if (!(supported & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT)) { 0328 + SafeRelease(swapChain3); 0329 + return EGL_BAD_MATCH; 0330 + } 0331 + 0332 + hr = swapChain3->SetColorSpace1(nativeColorSpace); 0333 + ASSERT(SUCCEEDED(hr)); 0334 + } 0335 + 0336 + SafeRelease(swapChain3); 0337 + 0338 +#if 0 0339 + 0340 + IDXGISwapChain4 *swapChain4 = d3d11::DynamicCastComObject<IDXGISwapChain4>(mSwapChain); 0341 + 0342 + DXGI_HDR_METADATA_HDR10 md; 0343 + md.RedPrimary[0] = 0.680 * 50000; 0344 + md.RedPrimary[1] = 0.320 * 50000; 0345 + md.GreenPrimary[0] = 0.265 * 50000; 0346 + md.GreenPrimary[1] = 0.690 * 50000; 0347 + md.BluePrimary[0] = 0.150 * 50000; 0348 + md.BluePrimary[1] = 0.060 * 50000; 0349 + md.WhitePoint[0] = 0.3127 * 50000; 0350 + md.WhitePoint[1] = 0.3290 * 50000; 0351 + md.MaxMasteringLuminance = 1000 * 10000; 0352 + md.MinMasteringLuminance = 0.001 * 10000; 0353 + md.MaxContentLightLevel = 1000; 0354 + md.MaxFrameAverageLightLevel = 200; 0355 + result = swapChain4->SetHDRMetaData(DXGI_HDR_METADATA_TYPE_HDR10, sizeof(md), &md); 0356 + // printf("*** Result hdr 0x%X\n", result); 0357 + SafeRelease(swapChain4); 0358 +#endif 0359 + } 0360 + 0361 ID3D11Texture2D *backbufferTex = nullptr; 0362 hr = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), 0363 reinterpret_cast<LPVOID *>(&backbufferTex)); 0364 ASSERT(SUCCEEDED(hr)); 0365 + 0366 + // TODO: recover rendering to sRGB 0367 + // 0368 + // D3D11_RENDER_TARGET_VIEW_DESC offscreenRTVDesc; 0369 + // offscreenRTVDesc.Format = getSwapChainNativeFormat(); 0370 + // 0371 + // if (mColorSpace == EGL_GL_COLORSPACE_SRGB_KHR) { 0372 + // if (offscreenRTVDesc.Format == DXGI_FORMAT_R8G8B8A8_UNORM) { 0373 + // offscreenRTVDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; 0374 + // } 0375 + // 0376 + // if (offscreenRTVDesc.Format == DXGI_FORMAT_B8G8R8A8_UNORM) { 0377 + // offscreenRTVDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; 0378 + // } 0379 + // } 0380 + // 0381 + // printf("*** Render target format: 0x%X\n", offscreenRTVDesc.Format); 0382 const auto &format = 0383 d3d11::Format::Get(mOffscreenRenderTargetFormat, mRenderer->getRenderer11DeviceCaps()); 0384 mBackBufferTexture.set(backbufferTex, format); 0385 diff --git a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h 0386 index 9dd98462c..a42a941c2 100644 0387 --- a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h 0388 +++ b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.h 0389 @@ -28,7 +28,8 @@ class SwapChain11 final : public SwapChainD3D 0390 GLenum backBufferFormat, 0391 GLenum depthBufferFormat, 0392 EGLint orientation, 0393 - EGLint samples); 0394 + EGLint samples, 0395 + EGLint colorSpace); 0396 ~SwapChain11() override; 0397 0398 EGLint resize(DisplayD3D *displayD3D, EGLint backbufferWidth, EGLint backbufferHeight) override; 0399 @@ -91,6 +92,7 @@ class SwapChain11 final : public SwapChainD3D 0400 EGLint mWidth; 0401 EGLint mHeight; 0402 const EGLint mOrientation; 0403 + EGLint mColorSpace; 0404 bool mAppCreatedShareHandle; 0405 unsigned int mSwapInterval; 0406 bool mPassThroughResourcesInit; 0407 diff --git a/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp b/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp 0408 index 722510a48..10462a970 100644 0409 --- a/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp 0410 +++ b/src/libANGLE/renderer/d3d/d3d11/win32/NativeWindow11Win32.cpp 0411 @@ -147,6 +147,9 @@ HRESULT NativeWindow11Win32::createSwapChain(ID3D11Device *device, 0412 0413 // Use IDXGIFactory2::CreateSwapChainForHwnd if DXGI 1.2 is available to create a 0414 // DXGI_SWAP_EFFECT_SEQUENTIAL swap chain. 0415 + // 0416 + // NOTE: in non-flip mode HDR rendering is not supported, so use it 0417 + // by default 0418 IDXGIFactory2 *factory2 = d3d11::DynamicCastComObject<IDXGIFactory2>(factory); 0419 if (factory2 != nullptr) 0420 { 0421 @@ -159,9 +162,9 @@ HRESULT NativeWindow11Win32::createSwapChain(ID3D11Device *device, 0422 swapChainDesc.SampleDesc.Quality = 0; 0423 swapChainDesc.BufferUsage = 0424 DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_BACK_BUFFER; 0425 - swapChainDesc.BufferCount = 1; 0426 + swapChainDesc.BufferCount = 2; 0427 swapChainDesc.Scaling = DXGI_SCALING_STRETCH; 0428 - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL; 0429 + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; 0430 swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; 0431 swapChainDesc.Flags = 0; 0432 IDXGISwapChain1 *swapChain1 = nullptr; 0433 @@ -177,7 +180,7 @@ HRESULT NativeWindow11Win32::createSwapChain(ID3D11Device *device, 0434 } 0435 0436 DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; 0437 - swapChainDesc.BufferCount = 1; 0438 + swapChainDesc.BufferCount = 2; 0439 swapChainDesc.BufferDesc.Format = format; 0440 swapChainDesc.BufferDesc.Width = width; 0441 swapChainDesc.BufferDesc.Height = height; 0442 @@ -192,6 +195,16 @@ HRESULT NativeWindow11Win32::createSwapChain(ID3D11Device *device, 0443 swapChainDesc.SampleDesc.Count = samples; 0444 swapChainDesc.SampleDesc.Quality = 0; 0445 swapChainDesc.Windowed = TRUE; 0446 + 0447 + /** 0448 + * NOTE1: in discard mode the swap chain doesn't support partial 0449 + * presentatiopn with Present1() call. Though it is not a big 0450 + * problem, because in case DXGI 1.2 is supported this code is 0451 + * unreachable. 0452 + * 0453 + * NOTE2: Flip modes are not supported on Windows 7 and the like, 0454 + * so use a legacy mode as a fallback 0455 + */ 0456 swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; 0457 0458 HRESULT result = factory->CreateSwapChain(device, &swapChainDesc, swapChain); 0459 diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp 0460 index 42932bd84..19f43422d 100644 0461 --- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp 0462 +++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp 0463 @@ -721,8 +721,10 @@ SwapChainD3D *Renderer9::createSwapChain(NativeWindowD3D *nativeWindow, 0464 GLenum backBufferFormat, 0465 GLenum depthBufferFormat, 0466 EGLint orientation, 0467 - EGLint samples) 0468 + EGLint samples, 0469 + EGLint colorSpace) 0470 { 0471 + ANGLE_UNUSED_VARIABLE(colorSpace); 0472 return new SwapChain9(this, GetAs<NativeWindow9>(nativeWindow), shareHandle, d3dTexture, 0473 backBufferFormat, depthBufferFormat, orientation); 0474 } 0475 diff --git a/src/libANGLE/renderer/d3d/d3d9/Renderer9.h b/src/libANGLE/renderer/d3d/d3d9/Renderer9.h 0476 index 8a306a026..bd0fd4932 100644 0477 --- a/src/libANGLE/renderer/d3d/d3d9/Renderer9.h 0478 +++ b/src/libANGLE/renderer/d3d/d3d9/Renderer9.h 0479 @@ -73,7 +73,8 @@ class Renderer9 : public RendererD3D 0480 GLenum backBufferFormat, 0481 GLenum depthBufferFormat, 0482 EGLint orientation, 0483 - EGLint samples) override; 0484 + EGLint samples, 0485 + EGLint colorSpace) override; 0486 egl::Error getD3DTextureInfo(const egl::Config *configuration, 0487 IUnknown *d3dTexture, 0488 const egl::AttributeMap &attribs, 0489 diff --git a/src/libANGLE/validationEGL.cpp b/src/libANGLE/validationEGL.cpp 0490 index 472405d5b..d897beb34 100644 0491 --- a/src/libANGLE/validationEGL.cpp 0492 +++ b/src/libANGLE/validationEGL.cpp 0493 @@ -461,6 +461,14 @@ bool ValidateColorspaceAttribute(const ValidationContext *val, 0494 return false; 0495 } 0496 break; 0497 + case EGL_GL_COLORSPACE_BT2020_PQ_EXT: 0498 + if (!displayExtensions.glColorspaceBt2020PQ) 0499 + { 0500 + val->setError(EGL_BAD_ATTRIBUTE, 0501 + "EGL_EXT_gl_colorspace_bt2020_pq is not available."); 0502 + return false; 0503 + } 0504 + break; 0505 default: 0506 val->setError(EGL_BAD_ATTRIBUTE); 0507 return false; 0508 -- 0509 2.24.1.windows.2 0510