From ddbfad6e95ab9af5c9a8d3d66f52864090789665 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sun, 20 Nov 2016 22:35:52 +0900 Subject: [PATCH] upload cursor texture in native plugin. --- .../Scenes/Multiple Monitors Roundly.unity | Bin 16560 -> 16600 bytes .../Plugins/x86_64/uDesktopDuplication.dll | Bin 76288 -> 77312 bytes Assets/uDesktopDuplication/Scripts/Cursor.cs | 42 +-- Assets/uDesktopDuplication/Scripts/Monitor.cs | 2 +- .../Shaders/uDD_Common.cginc | 24 +- .../Shaders/uDD_Standard.shader | 2 +- .../Shaders/uDD_Unlit.shader | 2 +- .../Shaders/uDD_Unlit_BlackMask.shader | 2 +- .../Shaders/uDD_Unlit_Transparent.shader | 2 +- .../uDesktopDuplication/Common.h | 12 +- .../uDesktopDuplication/Cursor.cpp | 241 ++++++++++++------ .../uDesktopDuplication/Cursor.h | 2 +- .../uDesktopDuplication.vcxproj | 3 +- 13 files changed, 181 insertions(+), 153 deletions(-) diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors Roundly.unity b/Assets/uDesktopDuplication/Examples/Scenes/Multiple Monitors Roundly.unity index a82f4e0df650b9b4fdc2c5115cb3ffefe0ad265f..a001cef29abd88a8ec28ca75e83e52809a5b2ae0 100644 GIT binary patch delta 292 zcmdnc$atfXQGkKL;w=M%!wm)o27U$xOM#67_AH{7^N#U|M(Ka7)z>}zcJq37MWAf% zMn89^$*b8sd>1e?GZ5^N9w3$l ziz@(CGlA8oPj+AzSIh*8f^^BF$!0^v6(%RJ2XdyQCY7eU6eX5#-oWmqxA~801*2pN zP{qIh|Nj?(UBkd|gX4}k$dCh*d(EX84JNNNmzLeY#=x)wD3$}p|Nn#JgT3dZgXoCO f56!o;ae%zSz_7q!@!$tvn7STV(`WsxGPCc6TX+^0DlaQqXP&Rp^ zpF7j!)odQV3mF(1ynrGsKr9W!3>*v$j6nF5nV}&N$mIcI8L+qlP?U)Qq&^nN2dS4u z6OW(lz%I_82$hwG$WCrx)||YYU1{@Wc2B*{Qf5_*k_kYWfB*mgF9Mnf0yjABh=b@I zlh>L{GippeX)Z0hf{lS;1yC#pjQ{@!$p?GSNe9sZn;9*(vjJVOz+v)58=c7;Yy~#i H-(Um)2E;jE diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 7ec2e46b6000e1ad32415a47867ccd1963933e7a..909c16529bad84c3b982a8fbbf5caa507b94563d 100644 GIT binary patch literal 77312 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 literal 76288 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 textures_ = new Dictionary(); - void Start() { uddTexture_ = GetComponent(); @@ -37,9 +23,8 @@ public class Cursor : MonoBehaviour { if (monitor.isCursorVisible) { UpdatePosition(); - UpdateTexture(); } - UpdateMaterial(); + UpdateCoords(); } void UpdatePosition() @@ -51,33 +36,10 @@ public class Cursor : MonoBehaviour worldPosition = transform.TransformPoint(localPos); } - void UpdateTexture() - { - var w = monitor.cursorShapeWidth; - var h = monitor.cursorShapeHeight; - if (w == 0 || h == 0) return; - - var key = w + h * 100; - if (!textures_.ContainsKey(key)) { - var texture = new Texture2D(w, h, TextureFormat.BGRA32, false); - texture.wrapMode = TextureWrapMode.Clamp; - textures_.Add(key, new TextureInfo(texture)); - } - - var cursorTexture = textures_[key]; - Assert.IsNotNull(cursorTexture.texture); - monitor.GetCursorTexture(cursorTexture.ptr); - uddTexture_.material.SetTexture("_CursorTex", cursorTexture.texture); - } - - void UpdateMaterial() + void UpdateCoords() { var x = monitor.isCursorVisible ? (float)monitor.cursorX / monitor.width : -9999f; var y = monitor.isCursorVisible ? (float)monitor.cursorY / monitor.height : -9999f; - var w = (float)monitor.cursorShapeWidth / monitor.width; - var h = (float)monitor.cursorShapeHeight / monitor.height; - uddTexture_.material.SetVector("_CursorPositionScale", new Vector4(x, y, w, h)); - coord = new Vector2(x, y); } } diff --git a/Assets/uDesktopDuplication/Scripts/Monitor.cs b/Assets/uDesktopDuplication/Scripts/Monitor.cs index 27f3beb..1d81318 100644 --- a/Assets/uDesktopDuplication/Scripts/Monitor.cs +++ b/Assets/uDesktopDuplication/Scripts/Monitor.cs @@ -253,7 +253,7 @@ public class Monitor public void Render() { - if (texture_ && available) { + if (texture_ && available && texturePtr_ != System.IntPtr.Zero) { Lib.SetTexturePtr(id, texturePtr_); GL.IssuePluginEvent(Lib.GetRenderEventFunc(), id); } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc b/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc index 7bbb632..61a56c8 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc +++ b/Assets/uDesktopDuplication/Shaders/uDD_Common.cginc @@ -64,32 +64,14 @@ inline void uddConvertToLinearIfNeeded(inout fixed3 rgb) } inline fixed4 uddGetScreenTexture(float2 uv) -{ - fixed4 c = tex2D(_MainTex, uv); - return c; -} - -inline fixed4 uddGetCursorTexture(float2 uv) -{ - uv.x = (uv.x - _CursorX) / _CursorWidth; - uv.y = (uv.y - _CursorY) / _CursorHeight; - fixed4 c = tex2D(_CursorTex, uv); - fixed a = step(0, uv.x) * step(0, uv.y) * step(uv.x, 1) * step(uv.y, 1); - c.a *= step(0.01, a); - return c; -} - -inline fixed4 uddGetScreenTextureWithCursor(float2 uv) { uv = uddInvertUV(uv); #ifdef USE_CLIP uv = uddClipUV(uv); #endif - fixed4 screen = uddGetScreenTexture(uddRotateUV(uv)); - fixed4 cursor = uddGetCursorTexture(uv); - fixed4 color = lerp(screen, cursor, cursor.a); - uddConvertToLinearIfNeeded(color.rgb); - return color; + fixed4 c = tex2D(_MainTex, uddRotateUV(uv)); + uddConvertToLinearIfNeeded(c.rgb); + return c; } inline void uddBendVertex(inout float4 v, half radius, half width, half thickness) diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader b/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader index 0b34bb5..fd62273 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Standard.shader @@ -34,7 +34,7 @@ SubShader void surf(Input IN, inout SurfaceOutputStandard o) { - fixed4 c = uddGetScreenTextureWithCursor(IN.uv_MainTex) * _Color; + fixed4 c = uddGetScreenTexture(IN.uv_MainTex) * _Color; o.Albedo = c.rgb; o.Metallic = _Metallic; o.Smoothness = _Glossiness; diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader index ccab4a5..6c3becc 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit.shader @@ -39,7 +39,7 @@ v2f vert(appdata v) fixed4 frag(v2f i) : SV_Target { - return uddGetScreenTextureWithCursor(i.uv); + return uddGetScreenTexture(i.uv); } ENDCG diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader index f2b543f..46b1f99 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_BlackMask.shader @@ -43,7 +43,7 @@ v2f vert(appdata v) fixed4 frag(v2f i) : SV_Target { - fixed4 tex = uddGetScreenTextureWithCursor(i.uv); + fixed4 tex = uddGetScreenTexture(i.uv); fixed alpha = pow((tex.r + tex.g + tex.b) / 3.0, _Mask); return fixed4(tex.rgb * _Color.rgb, alpha * _Color.a); } diff --git a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader index b00762d..cf2c96a 100644 --- a/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader +++ b/Assets/uDesktopDuplication/Shaders/uDD_Unlit_Transparent.shader @@ -41,7 +41,7 @@ v2f vert(appdata v) fixed4 frag(v2f i) : SV_Target { - return fixed4(uddGetScreenTextureWithCursor(i.uv).rgb, 1.0) * _Color; + return fixed4(uddGetScreenTexture(i.uv).rgb, 1.0) * _Color; } ENDCG diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h index 60bd24e..31a8c13 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Common.h @@ -83,7 +83,7 @@ public: return value_ != nullptr; } - T operator [](UINT index) const + const T operator [](UINT index) const { if (index >= size_) { @@ -93,6 +93,16 @@ public: return value_[index]; } + T& operator [](UINT index) + { + if (index >= size_) + { + Debug::Error("Array index out of range: ", index, size_); + return value_[0]; + } + return value_[index]; + } + private: std::unique_ptr value_; UINT size_ = 0; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp index aceef41..1a63c22 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.cpp @@ -79,33 +79,43 @@ void Cursor::UpdateTexture() return; } + // Check desktop texure + if (monitor_->GetUnityTexture() == nullptr) + { + Debug::Error("Cursor::UpdateTexture() => Monitor::GetUnityTexture() is null."); + return; + } + // Cursor information - const bool isMono = GetType() == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME; - const bool isColorMask = GetType() == DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR; const auto cursorImageWidth = GetWidth(); const auto cursorImageHeight = GetHeight(); const auto cursorImagePitch = GetPitch(); - // Captured area + // Captured size auto capturedImageWidth = cursorImageWidth; auto capturedImageHeight = cursorImageHeight; // Convert the buffer given by API into BGRA32 const UINT bgraBufferSize = cursorImageWidth * cursorImageHeight * 4; - bgra32Buffer_.ExpandIfNeeded(bgraBufferSize); + bgraBuffer_.ExpandIfNeeded(bgraBufferSize); // Check buffers - if (!bgra32Buffer_ || !apiBuffer_) + if (!bgraBuffer_ || !apiBuffer_) { return; } - // If masked, copy the desktop image and merge it with masked image. - if (isMono || isColorMask) + // Calculate information to capture desktop image under cursor. + D3D11_BOX box; + const auto monitorRot = static_cast(monitor_->GetRotation()); + auto colMin = 0; + auto colMax = cursorImageWidth; + auto rowMin = 0; + auto rowMax = cursorImageHeight; + { const auto monitorWidth = monitor_->GetWidth(); const auto monitorHeight = monitor_->GetHeight(); - const auto monitorRot = static_cast(monitor_->GetRotation()); const auto isVertical = monitorRot == DXGI_MODE_ROTATION_ROTATE90 || monitorRot == DXGI_MODE_ROTATION_ROTATE270; @@ -114,10 +124,6 @@ void Cursor::UpdateTexture() auto x = x_; auto y = y_; - auto colMin = 0; - auto colMax = cursorImageWidth; - auto rowMin = 0; - auto rowMax = cursorImageHeight; if (x < 0) { @@ -142,7 +148,6 @@ void Cursor::UpdateTexture() rowMax = capturedImageHeight; } - D3D11_BOX box; box.front = 0; box.back = 1; @@ -196,13 +201,11 @@ void Cursor::UpdateTexture() "(", desktopImageWidth, ", ", desktopImageHeight, ")"); return; } + } - if (monitor_->GetUnityTexture() == nullptr) - { - Debug::Error("Cursor::UpdateTexture() => Monitor::GetUnityTexture() is null."); - return; - } - + // Create texture + ComPtr texture; + { D3D11_TEXTURE2D_DESC desc; desc.Width = capturedImageWidth; desc.Height = capturedImageHeight; @@ -216,83 +219,89 @@ void Cursor::UpdateTexture() desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.MiscFlags = 0; - ComPtr texture; - if (FAILED(GetDevice()->CreateTexture2D(&desc, nullptr, &texture))) + if (FAILED(GetDevice()->CreateTexture2D(&desc, nullptr, &texture))) { Debug::Error("Cursor::UpdateTexture() => GetDevice()->CreateTexture2D() failed."); return; } + } + // Copy desktop image to the texture + { + ComPtr context; + GetDevice()->GetImmediateContext(&context); + context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); + } + + // Get mapped surface + ComPtr surface; + if (FAILED(texture.As(&surface))) + { + Debug::Error("Cursor::UpdateTexture() => texture->QueryInterface() failed."); + return; + } + + DXGI_MAPPED_RECT mappedSurface; + if (FAILED(surface->Map(&mappedSurface, DXGI_MAP_READ))) + { + Debug::Error("Cursor::UpdateTexture() => surface->Map() failed."); + return; + } + + // Finally, get the desktop texture under the mouse cursor. + const auto desktop32 = reinterpret_cast(mappedSurface.pBits); + const UINT desktopPitch = mappedSurface.Pitch / sizeof(UINT); + + // Take the monitor orientation into consideration. + const auto getDesktop32 = [&](int col, int row) + { + switch (monitorRot) { - ComPtr context; - GetDevice()->GetImmediateContext(&context); - context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); + case DXGI_MODE_ROTATION_ROTATE90: + return desktop32[(capturedImageWidth - 1 - col) * desktopPitch + row]; + case DXGI_MODE_ROTATION_ROTATE180: + return desktop32[(capturedImageHeight - 1 - row) * desktopPitch + (capturedImageWidth - 1 - col)]; + case DXGI_MODE_ROTATION_ROTATE270: + return desktop32[col * desktopPitch + (capturedImageHeight - 1 - row)]; + case DXGI_MODE_ROTATION_IDENTITY: + case DXGI_MODE_ROTATION_UNSPECIFIED: + return desktop32[row * desktopPitch + col]; } + }; - ComPtr surface; - if (FAILED(texture.As(&surface))) + // Access RGBA values at the same time + Buffer output; + output.ExpandIfNeeded(bgraBuffer_.Size()); + auto output32 = output.As(); + + switch (GetType()) + { + case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MONOCHROME: { - Debug::Error("Cursor::UpdateTexture() => texture->QueryInterface() failed."); - return; - } - - DXGI_MAPPED_RECT mappedSurface; - if (FAILED(surface->Map(&mappedSurface, DXGI_MAP_READ))) - { - Debug::Error("Cursor::UpdateTexture() => surface->Map() failed."); - return; - } - - // Finally, get the texture behind the mouse cursor. - const auto desktop32 = reinterpret_cast(mappedSurface.pBits); - const UINT desktopPitch = mappedSurface.Pitch / sizeof(UINT); - - // Take the monitor orientation into consideration. - const auto getDesktop32 = [&](int col, int row) - { - switch (monitorRot) + for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) { - case DXGI_MODE_ROTATION_ROTATE90: - return desktop32[(capturedImageWidth - 1 - col) * desktopPitch + row]; - break; - case DXGI_MODE_ROTATION_ROTATE180: - return desktop32[(capturedImageHeight - 1 - row) * desktopPitch + (capturedImageWidth - 1 - col)]; - break; - case DXGI_MODE_ROTATION_ROTATE270: - return desktop32[col * desktopPitch + (capturedImageHeight - 1 - row)]; - break; - case DXGI_MODE_ROTATION_IDENTITY: - case DXGI_MODE_ROTATION_UNSPECIFIED: - return desktop32[row * desktopPitch + col]; - break; - } - }; - - // Access RGBA values at the same time - auto output32 = reinterpret_cast(bgra32Buffer_.Get()); - - if (isMono) - { - for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) - { - for (int col = colMin, x = 0; col < colMax; ++col, ++x) + for (int col = colMin, x = 0; col < colMax; ++col, ++x) { + const int i = col + row * cursorImageWidth; + BYTE mask = 0b10000000 >> (col % 8); const BYTE andMask = apiBuffer_[col / 8 + row * cursorImagePitch] & mask; const BYTE xorMask = apiBuffer_[col / 8 + (row + capturedImageHeight) * cursorImagePitch] & mask; const UINT andMask32 = andMask ? 0xFFFFFFFF : 0x00000000; const UINT xorMask32 = xorMask ? 0xFFFFFFFF : 0x00000000; - output32[row * cursorImageWidth + col] = (getDesktop32(x, y) & andMask32) ^ xorMask32; + + output32[i] = (getDesktop32(x, y) & andMask32) ^ xorMask32; } } + break; } - else // DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR + case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_MASKED_COLOR: { - const auto buffer32 = reinterpret_cast(apiBuffer_.Get()); + const auto buffer32 = apiBuffer_.As(); - for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) + for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) { - for (int col = colMin, x = 0; col < colMax; ++col, ++x) + for (int col = colMin, x = 0; col < colMax; ++col, ++x) { const int i = col + row * cursorImageWidth; const int j = col + row * cursorImagePitch / sizeof(UINT); @@ -308,28 +317,92 @@ void Cursor::UpdateTexture() } } } + break; } - - if (FAILED(surface->Unmap())) + case DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR: { - return; + const auto buffer32 = apiBuffer_.As(); + auto output32 = bgraBuffer_.As(); + + for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) + { + for (int col = colMin, x = 0; col < colMax; ++col, ++x) + { + const int i = 4 * (col + row * cursorImageWidth); + + const auto desktop32 = getDesktop32(x, y); + const auto desktop = (BYTE*)(&desktop32); + const auto desktopB = desktop[0]; + const auto desktopG = desktop[1]; + const auto desktopR = desktop[2]; + const auto desktopA = desktop[3]; + + const auto cursorB = apiBuffer_[i + 0]; + const auto cursorG = apiBuffer_[i + 1]; + const auto cursorR = apiBuffer_[i + 2]; + const auto cursorA = apiBuffer_[i + 3]; + + const auto a0 = cursorA / 255.f; + const auto a1 = 1.f - a0; + + output[i + 0] = static_cast(cursorB * a0 + desktopB * a1); + output[i + 1] = static_cast(cursorG * a0 + desktopG * a1); + output[i + 2] = static_cast(cursorR * a0 + desktopR * a1); + output[i + 3] = desktopA; + } + } + break; + } + default: + { + Debug::Error("Cursor::UpdateTexture() => Unknown cursor type"); + break; } } - else // DXGI_OUTDUPL_POINTER_SHAPE_TYPE_COLOR + + // Rotation + auto bgraBuffer32 = bgraBuffer_.As(); + for (int row = rowMin, y = 0; row < rowMax; ++row, ++y) { - auto output32 = reinterpret_cast(bgra32Buffer_.Get()); - const auto buffer32 = reinterpret_cast(apiBuffer_.Get()); - for (int i = 0; i < cursorImageWidth * cursorImageHeight; ++i) + for (int col = colMin, x = 0; col < colMax; ++col, ++x) { - output32[i] = buffer32[i]; + const auto i = col + row * cursorImageWidth; + switch (monitorRot) + { + case DXGI_MODE_ROTATION_ROTATE90: + bgraBuffer32[i] = output32[col * cursorImageHeight + (cursorImageHeight - 1 - row)]; + break; + case DXGI_MODE_ROTATION_ROTATE180: + bgraBuffer32[i] = output32[(cursorImageHeight - 1 - row) * cursorImageWidth + (cursorImageWidth - 1 - col)]; + break; + case DXGI_MODE_ROTATION_ROTATE270: + bgraBuffer32[i] = output32[(cursorImageWidth - 1 - col) * cursorImageHeight + row]; + break; + case DXGI_MODE_ROTATION_IDENTITY: + case DXGI_MODE_ROTATION_UNSPECIFIED: + bgraBuffer32[i] = output32[i]; + break; + } } } + + { + ComPtr context; + GetDevice()->GetImmediateContext(&context); + context->UpdateSubresource(monitor_->GetUnityTexture(), 0, &box, bgraBuffer_.Get(), GetWidth() * 4, 0); + } + + if (FAILED(surface->Unmap())) + { + Debug::Error("Cursor::UpdateTexture() => surface->Unmap() failed."); + return; + } } void Cursor::GetTexture(ID3D11Texture2D* texture) { - if (!bgra32Buffer_) + if (!bgraBuffer_) { Debug::Error("Cursor::GetTexture() => bgra32Buffer is null."); return; @@ -356,7 +429,7 @@ void Cursor::GetTexture(ID3D11Texture2D* texture) ComPtr context; GetDevice()->GetImmediateContext(&context); - context->UpdateSubresource(texture, 0, nullptr, bgra32Buffer_.Get(), GetWidth() * 4, 0); + context->UpdateSubresource(texture, 0, nullptr, bgraBuffer_.Get(), GetWidth() * 4, 0); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h index 1c7b594..c35372a 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h @@ -32,7 +32,7 @@ private: int x_ = -1; int y_ = -1; Buffer apiBuffer_; - Buffer bgra32Buffer_; + Buffer bgraBuffer_; DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo_; LARGE_INTEGER timestamp_; }; \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj index dd75d00..89bbd12 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/uDesktopDuplication.vcxproj @@ -112,10 +112,11 @@ Level3 - MaxSpeed + Full true true true + AnySuitable true