CEFWebInterfaceBrowserWindowRHIHelper.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. // Engine/Source/Runtime/WebBrowser/Private/CEF/CEFWebInterfaceBrowserWindowRHIHelper.cpp
  2. #include "CEFWebInterfaceBrowserWindowRHIHelper.h"
  3. #include "WebInterfaceBrowserLog.h"
  4. #if WITH_CEF3
  5. #include "CEF/CEFWebInterfaceBrowserWindow.h"
  6. #if WITH_ENGINE
  7. #include "RHI.h"
  8. #if PLATFORM_WINDOWS
  9. #include "Slate/SlateTextures.h"
  10. #endif
  11. #endif
  12. #if PLATFORM_WINDOWS
  13. #include "Windows/AllowWindowsPlatformTypes.h"
  14. #include "d3d11.h"
  15. #include "d3d11_1.h"
  16. #include "Windows/HideWindowsPlatformTypes.h"
  17. #endif // PLATFORM_WINDOWS
  18. FCEFWebInterfaceBrowserWindowRHIHelper::~FCEFWebInterfaceBrowserWindowRHIHelper()
  19. {
  20. }
  21. bool FCEFWebInterfaceBrowserWindowRHIHelper::BUseRHIRenderer()
  22. {
  23. #if WITH_ENGINE
  24. if (GDynamicRHI != nullptr && FCEFWebInterfaceBrowserWindow::CanSupportAcceleratedPaint())
  25. {
  26. return RHIGetInterfaceType() == ERHIInterfaceType::D3D11;
  27. }
  28. #endif
  29. return false;
  30. }
  31. void FCEFWebInterfaceBrowserWindowRHIHelper::UpdateCachedGeometry(const FGeometry& AllottedGeometryIn)
  32. {
  33. AllottedGeometry = AllottedGeometryIn;
  34. }
  35. TOptional<FSlateRenderTransform> FCEFWebInterfaceBrowserWindowRHIHelper::GetWebBrowserRenderTransform() const
  36. {
  37. return FSlateRenderTransform(Concatenate(FScale2D(1, -1), FVector2D(0, AllottedGeometry.GetLocalSize().Y)));
  38. }
  39. FSlateUpdatableTexture *FCEFWebInterfaceBrowserWindowRHIHelper::CreateTexture(void* SharedHandle)
  40. {
  41. #if WITH_ENGINE
  42. check(BUseRHIRenderer());
  43. #if PLATFORM_WINDOWS
  44. ID3D11Device1* dev1 = nullptr;
  45. ID3D11Device* D3D11Device = static_cast<ID3D11Device*>(GDynamicRHI->RHIGetNativeDevice());
  46. HRESULT Hr = D3D11Device->QueryInterface(__uuidof(ID3D11Device1), reinterpret_cast<void**>(&dev1));
  47. if (FAILED(Hr))
  48. {
  49. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::CreateTexture() - - ID3D11Device::QueryInterface"));
  50. return nullptr;
  51. }
  52. ID3D11Texture2D* tex = nullptr;
  53. Hr = dev1->OpenSharedResource1(SharedHandle, __uuidof(ID3D11Texture2D), (void**)(&tex));
  54. if (FAILED(Hr))
  55. {
  56. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::CreateTexture() - - ID3D11Device::OpenSharedResource"));
  57. return nullptr;
  58. }
  59. D3D11_TEXTURE2D_DESC TexDesc;
  60. tex->GetDesc(&TexDesc);
  61. FSlateTexture2DRHIRef* NewTexture = new FSlateTexture2DRHIRef(TexDesc.Width, TexDesc.Height, PF_R8G8B8A8, nullptr, TexCreate_Dynamic, true);
  62. if (IsInRenderingThread())
  63. {
  64. NewTexture->InitResource();
  65. }
  66. else
  67. {
  68. BeginInitResource(NewTexture);
  69. }
  70. return NewTexture;
  71. #else
  72. return nullptr;
  73. #endif
  74. #else
  75. return nullptr;
  76. #endif
  77. }
  78. void FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture(void *SharedHandle, FSlateUpdatableTexture* SlateTexture, const FIntRect& DirtyIn)
  79. {
  80. #if WITH_ENGINE
  81. check(BUseRHIRenderer());
  82. FIntRect Dirty = DirtyIn;
  83. #if PLATFORM_WINDOWS
  84. ID3D11Device1* dev1 = nullptr;
  85. ID3D11Device* D3D11Device = static_cast<ID3D11Device*>(GDynamicRHI->RHIGetNativeDevice());
  86. HRESULT Hr = D3D11Device->QueryInterface(__uuidof(ID3D11Device1), reinterpret_cast<void**>(&dev1));
  87. if (FAILED(Hr))
  88. {
  89. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - ID3D11Device::QueryInterface"), Hr);
  90. return;
  91. }
  92. ID3D11Texture2D* Tex = nullptr;
  93. Hr = dev1->OpenSharedResource1(SharedHandle, __uuidof(ID3D11Texture2D), (void**)(&Tex));
  94. if (FAILED(Hr))
  95. {
  96. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - ID3D11Device::OpenSharedResource"), Hr);
  97. return;
  98. }
  99. D3D11_TEXTURE2D_DESC TexDesc;
  100. Tex->GetDesc(&TexDesc);
  101. if (SlateTexture->GetSlateResource()->GetWidth() != TexDesc.Width
  102. || SlateTexture->GetSlateResource()->GetHeight() != TexDesc.Height)
  103. {
  104. SlateTexture->ResizeTexture(TexDesc.Width, TexDesc.Height);
  105. Dirty = FIntRect();
  106. }
  107. TRefCountPtr<IDXGIKeyedMutex> KeyedMutex;
  108. Hr = Tex->QueryInterface(_uuidof(IDXGIKeyedMutex), (void**)&KeyedMutex);
  109. if (FAILED(Hr))
  110. {
  111. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - ID3D11Texture2D::IDXGIKeyedMutex"), Hr);
  112. return;
  113. }
  114. ENQUEUE_RENDER_COMMAND(CEFAcceleratedPaint)(
  115. [KeyedMutex, SlateTexture, Dirty, Tex](FRHICommandList& RHICmdList)
  116. {
  117. if (KeyedMutex)
  118. {
  119. if (KeyedMutex->AcquireSync(1, 16) == S_OK)
  120. {
  121. D3D11_BOX Region;
  122. Region.front = 0;
  123. Region.back = 1;
  124. if (Dirty.Area() > 0)
  125. {
  126. Region.left = Dirty.Min.X;
  127. Region.top = Dirty.Min.Y;
  128. Region.right = Dirty.Max.X;
  129. Region.bottom = Dirty.Max.Y;
  130. }
  131. else
  132. {
  133. Region.left = 0;
  134. Region.right = SlateTexture->GetSlateResource()->GetWidth();
  135. Region.top = 0;
  136. Region.bottom = SlateTexture->GetSlateResource()->GetHeight();
  137. }
  138. ID3D11DeviceContext* DX11DeviceContext = nullptr;
  139. ID3D11Device* D3D11Device = static_cast<ID3D11Device*>(GDynamicRHI->RHIGetNativeDevice());
  140. D3D11Device->GetImmediateContext(&DX11DeviceContext);
  141. check(DX11DeviceContext);
  142. FSlateTexture2DRHIRef* SlateRHITexture = static_cast<FSlateTexture2DRHIRef*>(SlateTexture);
  143. check(SlateRHITexture);
  144. auto Slate2DRef = SlateRHITexture->GetRHIRef();
  145. if (Slate2DRef && Slate2DRef.IsValid())
  146. {
  147. auto Slate2DTexture = Slate2DRef->GetTexture2D();
  148. if (Slate2DTexture)
  149. {
  150. ID3D11Texture2D* D3DTexture = (ID3D11Texture2D*)Slate2DTexture->GetNativeResource();
  151. DX11DeviceContext->CopySubresourceRegion(D3DTexture, 0, Region.left, Region.top, Region.front, Tex, 0, &Region);
  152. }
  153. }
  154. KeyedMutex->ReleaseSync(0);
  155. }
  156. else
  157. {
  158. UE_LOG(LogWebInterfaceBrowser, Verbose, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - failed getting sync"), E_FAIL);
  159. }
  160. }
  161. else
  162. {
  163. UE_LOG(LogWebInterfaceBrowser, Verbose, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - missing KeyedMutex"), E_FAIL);
  164. return;
  165. }
  166. });
  167. #else
  168. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - missing implementation"));
  169. #endif // PLATFORM_WINDOWS
  170. #else
  171. UE_LOG(LogWebInterfaceBrowser, Error, TEXT("FCEFWebInterfaceBrowserWindowRHIHelper::UpdateSharedHandleTexture() - unsupported usage, RHI renderer but missing engine"));
  172. #endif // WITH_ENGINE
  173. }
  174. #endif