From 91684610bfc42687582432bbe11b3c4c499e3d7a Mon Sep 17 00:00:00 2001 From: David Anderson Date: Tue, 17 Nov 2015 13:38:12 -0800 Subject: [PATCH] Add IPC helpers to marshal DXGI_ADAPTER_DESC. (bug 1225283 part 1, r=mattwoodrow) --- dom/plugins/ipc/PluginInstanceParent.cpp | 2 +- gfx/ipc/D3DMessageUtils.cpp | 77 ++++++++++++++++++++++++ gfx/ipc/D3DMessageUtils.h | 47 +++++++++++++++ gfx/ipc/GraphicsMessages.ipdlh | 18 +----- gfx/ipc/moz.build | 2 + gfx/thebes/gfxWindowsPlatform.cpp | 21 +++---- 6 files changed, 138 insertions(+), 29 deletions(-) create mode 100644 gfx/ipc/D3DMessageUtils.cpp create mode 100644 gfx/ipc/D3DMessageUtils.h diff --git a/dom/plugins/ipc/PluginInstanceParent.cpp b/dom/plugins/ipc/PluginInstanceParent.cpp index 9b12a02a2170..5f0c42907f30 100644 --- a/dom/plugins/ipc/PluginInstanceParent.cpp +++ b/dom/plugins/ipc/PluginInstanceParent.cpp @@ -1004,7 +1004,7 @@ PluginInstanceParent::NPP_SetWindow(const NPWindow* aWindow) #if defined(MOZ_X11) && defined(XP_UNIX) && !defined(XP_MACOSX) const NPSetWindowCallbackStruct* ws_info = static_cast(aWindow->ws_info); - window.visualID = ws_info->visual ? ws_info->visual->visualid : None; + window.visualID = ws_info->visual ? ws_info->visual->visualid : 0; window.colormap = ws_info->colormap; #endif diff --git a/gfx/ipc/D3DMessageUtils.cpp b/gfx/ipc/D3DMessageUtils.cpp new file mode 100644 index 000000000000..607f29791b6a --- /dev/null +++ b/gfx/ipc/D3DMessageUtils.cpp @@ -0,0 +1,77 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set ts=8 sts=4 et sw=4 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "D3DMessageUtils.h" +#if defined(XP_WIN) +# include "gfxWindowsPlatform.h" +#endif + +bool +DxgiAdapterDesc::operator ==(const DxgiAdapterDesc& aOther) const +{ + return memcmp(&aOther, this, sizeof(*this)) == 0; +} + +#if defined(XP_WIN) +static_assert(sizeof(DxgiAdapterDesc) == sizeof(DXGI_ADAPTER_DESC), + "DXGI_ADAPTER_DESC doe snot match DxgiAdapterDesc"); + +const DxgiAdapterDesc& +DxgiAdapterDesc::From(const DXGI_ADAPTER_DESC& aDesc) +{ + return reinterpret_cast(aDesc); +} +#endif + +namespace IPC { + +void +ParamTraits::Write(Message* aMsg, const paramType& aParam) +{ +#if defined(XP_WIN) + aMsg->WriteBytes(aParam.Description, sizeof(aParam.Description)); + WriteParam(aMsg, aParam.VendorId); + WriteParam(aMsg, aParam.DeviceId); + WriteParam(aMsg, aParam.SubSysId); + WriteParam(aMsg, aParam.Revision); + WriteParam(aMsg, aParam.DedicatedVideoMemory); + WriteParam(aMsg, aParam.DedicatedSystemMemory); + WriteParam(aMsg, aParam.SharedSystemMemory); + WriteParam(aMsg, aParam.AdapterLuid.LowPart); + WriteParam(aMsg, aParam.AdapterLuid.HighPart); +#else + MOZ_ASSERT_UNREACHABLE("DxgiAdapterDesc is Windows-only"); +#endif +} + +bool +ParamTraits::Read(const Message* aMsg, void** aIter, paramType* aResult) +{ +#if defined(XP_WIN) + const char* description = nullptr; + if (!aMsg->ReadBytes(aIter, &description, sizeof(aResult->Description))) { + return false; + } + memcpy(aResult->Description, description, sizeof(aResult->Description)); + + if (ReadParam(aMsg, aIter, &aResult->VendorId) && + ReadParam(aMsg, aIter, &aResult->DeviceId) && + ReadParam(aMsg, aIter, &aResult->SubSysId) && + ReadParam(aMsg, aIter, &aResult->Revision) && + ReadParam(aMsg, aIter, &aResult->DedicatedVideoMemory) && + ReadParam(aMsg, aIter, &aResult->DedicatedSystemMemory) && + ReadParam(aMsg, aIter, &aResult->SharedSystemMemory) && + ReadParam(aMsg, aIter, &aResult->AdapterLuid.LowPart) && + ReadParam(aMsg, aIter, &aResult->AdapterLuid.HighPart)) + { + return true; + } +#else + MOZ_ASSERT_UNREACHABLE("DxgiAdapterDesc is Windows-only"); +#endif + return false; +} + +} // namespace IPC diff --git a/gfx/ipc/D3DMessageUtils.h b/gfx/ipc/D3DMessageUtils.h new file mode 100644 index 000000000000..9dafecd42785 --- /dev/null +++ b/gfx/ipc/D3DMessageUtils.h @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim: set ts=8 sts=4 et sw=4 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef _include_gfx_ipc_D3DMessageUtils_h__ +#define _include_gfx_ipc_D3DMessageUtils_h__ + +#include "chrome/common/ipc_message_utils.h" +#include "ipc/IPCMessageUtils.h" + +// Can't include dxgi.h, since it leaks random identifiers and #defines, and +// IPDL causes this file to be #included all over. +typedef struct DXGI_ADAPTER_DESC DXGI_ADAPTER_DESC; + +struct DxgiAdapterDesc +{ +#if defined(XP_WIN) + WCHAR Description[128]; + UINT VendorId; + UINT DeviceId; + UINT SubSysId; + UINT Revision; + SIZE_T DedicatedVideoMemory; + SIZE_T DedicatedSystemMemory; + SIZE_T SharedSystemMemory; + LUID AdapterLuid; + + static const DxgiAdapterDesc& From(const DXGI_ADAPTER_DESC& aDesc); +#endif + + bool operator ==(const DxgiAdapterDesc& aOther) const; +}; + +namespace IPC { + +template <> +struct ParamTraits +{ + typedef DxgiAdapterDesc paramType; + static void Write(Message* aMsg, const paramType& aParam); + static bool Read(const Message* aMsg, void** aIter, paramType* aResult); +}; + +} // namespace IPC + +#endif // _include_gfx_ipc_D3DMessageUtils_h__ diff --git a/gfx/ipc/GraphicsMessages.ipdlh b/gfx/ipc/GraphicsMessages.ipdlh index a7e21b99cb3b..f72f09abb892 100644 --- a/gfx/ipc/GraphicsMessages.ipdlh +++ b/gfx/ipc/GraphicsMessages.ipdlh @@ -5,23 +5,11 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +using struct DxgiAdapterDesc from "mozilla/D3DMessageUtils.h"; + namespace mozilla { namespace gfx { -struct DxgiLUID -{ - uint32_t LowPart; - int32_t HighPart; -}; - -struct DxgiDesc -{ - uint32_t vendorID; - uint32_t deviceID; - uint32_t subSysID; - DxgiLUID luid; -}; - struct DeviceInitData { bool useAcceleration; @@ -33,7 +21,7 @@ struct DeviceInitData bool d3d11TextureSharingWorks; bool useD2D; bool useD2D1; - DxgiDesc dxgiDesc; + DxgiAdapterDesc adapter; }; } // namespace gfx diff --git a/gfx/ipc/moz.build b/gfx/ipc/moz.build index 2051e34a825e..e3500a5b632b 100644 --- a/gfx/ipc/moz.build +++ b/gfx/ipc/moz.build @@ -5,6 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. EXPORTS.mozilla += [ + 'D3DMessageUtils.h', 'GfxMessageUtils.h' ] @@ -23,6 +24,7 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': ] UNIFIED_SOURCES += [ + 'D3DMessageUtils.cpp', 'SharedDIB.cpp', ] diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp index 815c9cc32269..f7f47df87ecc 100755 --- a/gfx/thebes/gfxWindowsPlatform.cpp +++ b/gfx/thebes/gfxWindowsPlatform.cpp @@ -2209,14 +2209,14 @@ gfxWindowsPlatform::ContentAdapterIsParentAdapter(ID3D11Device* device) return false; } - const DxgiDesc& parent = GetParentDevicePrefs().dxgiDesc(); - if (desc.VendorId != parent.vendorID() || - desc.DeviceId != parent.deviceID() || - desc.SubSysId != parent.subSysID() || - desc.AdapterLuid.HighPart != parent.luid().HighPart() || - desc.AdapterLuid.LowPart != parent.luid().LowPart()) + const DxgiAdapterDesc& parent = GetParentDevicePrefs().adapter(); + if (desc.VendorId != parent.VendorId || + desc.DeviceId != parent.DeviceId || + desc.SubSysId != parent.SubSysId || + desc.AdapterLuid.HighPart != parent.AdapterLuid.HighPart || + desc.AdapterLuid.LowPart != parent.AdapterLuid.LowPart) { - gfxCriticalNote << "VendorIDMismatch " << hexa(parent.vendorID()) << " " << hexa(desc.VendorId); + gfxCriticalNote << "VendorIDMismatch " << hexa(parent.VendorId) << " " << hexa(desc.VendorId); return false; } @@ -3027,11 +3027,6 @@ gfxWindowsPlatform::GetDeviceInitData(DeviceInitData* aOut) if (!GetDxgiDesc(mD3D11Device, &desc)) { return; } - - aOut->dxgiDesc().vendorID() = desc.VendorId; - aOut->dxgiDesc().deviceID() = desc.DeviceId; - aOut->dxgiDesc().subSysID() = desc.SubSysId; - aOut->dxgiDesc().luid().LowPart() = desc.AdapterLuid.LowPart; - aOut->dxgiDesc().luid().HighPart() = desc.AdapterLuid.HighPart; + aOut->adapter() = DxgiAdapterDesc::From(desc); } }