fune/gfx/layers/LayersTypes.cpp
sotaro 5eabf27101 Bug 1817617 - Wait ID3D11Query of D3D11Texture2D copy complete just before blitting for video overlay with non Intel GPUs r=media-playback-reviewers,padenot
Normally when D3D11Texture2D is copied by ID3D11DeviceContext::CopySubresourceRegion() with compositor device, WebRender does not need to wait copy complete, since WebRender also uses compositor device.

But with Non-intel GPUs(like NDIVIA), there is a case that the copy complete need to be wait explicitly even with compositor device

mSyncObject->Synchronize() could not be used with compositor device.

Wait of the query is not called in D3D11DXVA2Manager::CopyToImage(), since the wait could take long time. Then the Wait of the query is deferred to just before blitting for video overlay.

Differential Revision: https://phabricator.services.mozilla.com/D200041
2024-02-01 10:28:32 +00:00

95 lines
2.5 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 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 "LayersTypes.h"
#include <cinttypes>
#include "nsPrintfCString.h"
#include "mozilla/gfx/gfxVars.h"
#ifdef XP_WIN
# include "gfxConfig.h"
# include "mozilla/StaticPrefs_gfx.h"
#endif
namespace mozilla {
namespace layers {
const char* kCompositionPayloadTypeNames[kCompositionPayloadTypeCount] = {
"KeyPress",
"APZScroll",
"APZPinchZoom",
"ContentPaint",
"MouseUpFollowedByClick",
};
const char* GetLayersBackendName(LayersBackend aBackend) {
switch (aBackend) {
case LayersBackend::LAYERS_NONE:
return "none";
case LayersBackend::LAYERS_WR:
if (gfx::gfxVars::UseSoftwareWebRender()) {
#ifdef XP_WIN
if (gfx::gfxVars::AllowSoftwareWebRenderD3D11() &&
gfx::gfxConfig::IsEnabled(gfx::Feature::D3D11_COMPOSITING)) {
return "webrender_software_d3d11";
}
#endif
return "webrender_software";
}
return "webrender";
default:
MOZ_ASSERT_UNREACHABLE("unknown layers backend");
return "unknown";
}
}
std::ostream& operator<<(std::ostream& aStream, const LayersId& aId) {
return aStream << nsPrintfCString("0x%" PRIx64, aId.mId).get();
}
/* static */
CompositableHandle CompositableHandle::GetNext() {
static std::atomic<uint64_t> sCounter = 0;
return CompositableHandle{++sCounter};
}
/* static */
RemoteTextureId RemoteTextureId::GetNext() {
static std::atomic<uint64_t> sCounter = 0;
return RemoteTextureId{++sCounter};
}
/* static */
RemoteTextureOwnerId RemoteTextureOwnerId::GetNext() {
static std::atomic<uint64_t> sCounter = 0;
return RemoteTextureOwnerId{++sCounter};
}
/* static */
GpuProcessTextureId GpuProcessTextureId::GetNext() {
if (!XRE_IsGPUProcess()) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
return GpuProcessTextureId{};
}
static std::atomic<uint64_t> sCounter = 0;
return GpuProcessTextureId{++sCounter};
}
/* static */
GpuProcessQueryId GpuProcessQueryId::GetNext() {
if (!XRE_IsGPUProcess()) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
return GpuProcessQueryId{};
}
static std::atomic<uint64_t> sCounter = 0;
return GpuProcessQueryId{++sCounter};
}
} // namespace layers
} // namespace mozilla